Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中实现for…in?_Javascript_Algorithm_Object_Cross Browser_Iteration - Fatal编程技术网

如何在JavaScript中实现for…in?

如何在JavaScript中实现for…in?,javascript,algorithm,object,cross-browser,iteration,Javascript,Algorithm,Object,Cross Browser,Iteration,我在声明中看到一个关于…的问题,并警告说该订单不可信。当前节点和访问节点的迭代和跟踪是如何在内部完成的,以及JavaScript引擎之间的区别是什么 以任意顺序迭代对象的可枚举属性 我确信JavaScript引擎的内部细节各不相同,甚至很可能在任何特定引擎的版本之间也存在差异。我猜在许多引擎中,都是通过某种哈希表实现来实现的。由于哈希函数会随着哈希表的增长对键进行重新排序,因此,例如,属性a和b的相对顺序可以通过添加新属性c而改变,而无需改变引擎或任何东西。似乎对象.keys()的实现和对象。定

我在声明中看到一个关于…的问题,并警告说该订单不可信。当前节点和访问节点的迭代和跟踪是如何在内部完成的,以及JavaScript引擎之间的区别是什么

以任意顺序迭代对象的可枚举属性


我确信JavaScript引擎的内部细节各不相同,甚至很可能在任何特定引擎的版本之间也存在差异。我猜在许多引擎中,都是通过某种哈希表实现来实现的。由于哈希函数会随着哈希表的增长对键进行重新排序,因此,例如,属性
a
b
的相对顺序可以通过添加新属性
c
而改变,而无需改变引擎或任何东西。

似乎
对象.keys()的实现
对象。定义属性
应模仿
中的行为:

如果实现为for in语句定义了特定的枚举顺序,则在该算法的步骤5中必须使用相同的枚举顺序

可供参考

delete
操作符也会使事情复杂化:

未指定枚举属性的机制和顺序(第一个算法中的步骤6.a,第二个算法中的步骤7.a)。枚举期间可能会删除正在枚举的对象的属性。如果删除了枚举期间尚未访问的属性,则不会访问该属性。如果在枚举期间向要枚举的对象添加新属性,则不保证在活动枚举中访问新添加的属性。在任何枚举中,属性名称的访问次数不得超过一次

原型链中的冲突可以命名为:

枚举对象的属性包括递归枚举其原型的属性以及原型的原型等;但是,如果原型的某个属性被“隐藏”,则不会枚举该属性,因为原型链中以前的某个对象具有同名的属性。确定原型对象的属性是否被原型链上的前一个对象遮挡时,不考虑[[Enumerable]]属性的值

参考资料


这篇相关文章可能会提供一些见解