JS对象键序列

Sal*_*man 3 javascript

javascript是否保证即使将新值分配给键,也会保留对象的键序列?

例如,如果我有以下对象

var Object = {
    keyX: value1,
    keyB: value2,
    keyZ: value3
}
Run Code Online (Sandbox Code Playgroud)

如果我使用密钥迭代for .. in,我得到正确的序列即keyX, keyB, keyZ.如果我改变了值keyB,我仍然在迭代中获得相同的序列.

我的问题是,序列是否始终保持不变,或者在任何情况下都可能发生变化?

rai*_*7ow 6

嗯,在文档(MDN)中很清楚地说:

for ... in循环以任意顺序迭代对象的属性.

本节文件给出了更全面的解释如下:

虽然ECMAScript使对象的迭代顺序依赖于实现,但似乎所有主流浏览器都支持基于最先添加的属性的迭代顺序(至少对于不在原型上的属性).但是,对于Internet Explorer,当在属性上使用delete时,会产生一些令人困惑的行为,从而阻止其他浏览器将对象文字等简单对象用作有序关联数组.

在资源管理器中,虽然属性值确实设置为未定义,但如果后来添加了一个具有相同名称的属性,则该属性将在其旧位置迭代 - 而不是在迭代序列的末尾,正如人们可能期望的那样删除了该属性,然后将其添加回来.