Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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在后续执行中是否以相同的顺序迭代?_Javascript_Ecmascript 5_For In Loop - Fatal编程技术网

Javascript for在后续执行中是否以相同的顺序迭代?

Javascript for在后续执行中是否以相同的顺序迭代?,javascript,ecmascript-5,for-in-loop,Javascript,Ecmascript 5,For In Loop,众所周知,ECMA标准不能保证特定的迭代顺序,但我对实际的迭代顺序不感兴趣。我需要知道的是:如果在同一个会话中多次执行for in循环,那么for in循环是否至少保证相同的迭代顺序,前提是在后续for in执行之间没有添加或删除迭代对象的属性?我可以猜测没有理由不发生这种情况,但我想找到一些参考。顺序是任意的,您只能猜测它将始终以相同的顺序迭代。只是不要期望它总是一样的 下面的引号用于数组,同样适用于在对象属性上使用它 因为迭代的顺序依赖于实现,所以在数组上迭代可能不会以一致的顺序访问元素 添

众所周知,ECMA标准不能保证特定的迭代顺序,但我对实际的迭代顺序不感兴趣。我需要知道的是:如果在同一个会话中多次执行for in循环,那么for in循环是否至少保证相同的迭代顺序,前提是在后续for in执行之间没有添加或删除迭代对象的属性?我可以猜测没有理由不发生这种情况,但我想找到一些参考。

顺序是任意的,您只能猜测它将始终以相同的顺序迭代。只是不要期望它总是一样的

下面的引号用于数组,同样适用于在对象属性上使用它

因为迭代的顺序依赖于实现,所以在数组上迭代可能不会以一致的顺序访问元素

添加了一些额外的信息:

尽管ECMAScript使对象的迭代顺序依赖于实现,但似乎所有主要浏览器都支持基于最先添加的属性的迭代顺序(至少对于不在原型上的属性)。但是,在Internet Explorer中,当对属性使用delete时,会产生一些令人困惑的行为,从而阻止其他浏览器将简单对象(如对象文字)用作有序关联数组。在资源管理器中,虽然属性值确实设置为“未定义”,但如果稍后添加回具有相同名称的属性,则该属性将在其旧位置进行迭代——而不是在删除属性并将其添加回后,在迭代序列的末尾进行迭代


我自己也不能肯定地说,但除非使用web workers,否则在检查对象上的键时可能会有一些缓存机制。鉴于这是“单线程”(同样,这只是高层次的思考),如果在第一轮之后立即调用相同的for..in循环,您将按照第一轮的顺序获得相同的键集。如果出于某种原因您想保证这一点,您可以迭代所有键,将它们存储在一个数组中,然后迭代数组并通过
obj[crntKey]
访问,另请参见:“简言之:如果顺序对您很重要,请使用数组。”如果您使用常规
for
循环来循环数组(与中..的
相反,通常应避免使用数组)或者一个
forEach
回调,当然每次的顺序都是一致的。Idd,我想说的是,它不在规范中,所以人们永远不应该依赖它。是的,我并不反对你的回答;我只是认为我提供的链接提供了一些可能有用的额外信息。