javascript是否保证即使将新值分配给键也能保留对象的键序列?
例如,如果我有以下对象
var Object = {
keyX: value1,
keyB: value2,
keyZ: value3
}
如果我使用 遍历键for .. in
,我会得到正确的序列,即keyX, keyB, keyZ
. 如果我改变 的值keyB
,我仍然会在迭代中得到相同的序列。
我的问题是,顺序会始终保持不变,还是在任何情况下都可能改变?
javascript是否保证即使将新值分配给键也能保留对象的键序列?
例如,如果我有以下对象
var Object = {
keyX: value1,
keyB: value2,
keyZ: value3
}
如果我使用 遍历键for .. in
,我会得到正确的序列,即keyX, keyB, keyZ
. 如果我改变 的值keyB
,我仍然会在迭代中得到相同的序列。
我的问题是,顺序会始终保持不变,还是在任何情况下都可能改变?
好吧,在文档( MDN)中说得很清楚:
for...in 循环以任意顺序迭代对象的属性。
这部分文档对此给出了更全面的解释:
尽管 ECMAScript 使对象的迭代顺序依赖于实现,但似乎所有主流浏览器都支持基于最早添加的属性的迭代顺序(至少对于不在原型上的属性)。但是,在 Internet Explorer 的情况下,当对属性使用 delete 时,会导致一些令人困惑的行为,从而阻止其他浏览器使用像对象字面量这样的简单对象作为有序关联数组。
在资源管理器中,虽然属性值确实设置为未定义,但如果稍后添加回具有相同名称的属性,则该属性将在其旧位置进行迭代——而不是在迭代序列的末尾,正如人们可能期望的那样删除该属性,然后将其添加回来。