【问题标题】:Do for-in loops iterate in the same order through subsequent executions?for-in 循环是否在后续执行中以相同的顺序迭代?
【发布时间】:2015-11-04 02:55:56
【问题描述】:

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

【问题讨论】:

  • 我自己不能肯定地说,但除非使用网络工作者,我会说在检查对象上的键时可能存在一些缓存机制。看到这是“单线程”(同样,这只是高级思考),如果您在第一轮之后立即调用相同的 for..in 循环,您将按顺序获得相同的键集第一个。如果出于某种原因您想保证这一点,您可以遍历所有键,将它们存储在一个数组中,然后遍历数组并通过 obj[crntKey] 访问

标签: javascript ecmascript-5 for-in-loop


【解决方案1】:

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

下面的引用是用于数组的for-in,同样适用于在对象属性上使用它。

因为迭代的顺序取决于实现,所以对数组进行迭代可能不会以一致的顺序访问元素。

delete operator 为其添加了一些额外信息:

尽管 ECMAScript 使对象的迭代顺序依赖于实现,但似乎所有主流浏览器都支持基于最早添加的属性的迭代顺序(至少对于不在原型上的属性)。但是,在 Internet Explorer 的情况下,当对属性使用 delete 时,会导致一些令人困惑的行为,从而阻止其他浏览器使用像对象字面量这样的简单对象作为有序关联数组。在资源管理器中,虽然属性值确实设置为未定义,但如果稍后添加回具有相同名称的属性,则该属性将在其旧位置进行迭代——而不是在迭代序列的末尾,正如人们可能期望的那样删除该属性,然后将其添加回来。

【讨论】:

  • 来自this answer:“简而言之:如果顺序对您很重要,请使用数组。”如果您使用常规的 for 循环(而不是 for..in,通常应该避免使用数组)或 forEach 回调来循环数组,那么当然每次的顺序都是一致的。
  • Idd,我想说的是,它不在规范中,所以永远不要依赖它。
  • 是的,我不反对你的回答;我只是认为我提供的链接提供了一些可能有用的附加信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多