注意:我使用的Nodejs可能会或可能不会与香草ECMAscript的标准有细微差别。
我一直听说当使用for-each循环迭代对象的属性时,我不应指望属性处于相同的顺序。 (尽管在实践中我从未见过以不同顺序迭代对象的情况)。在制作中,我们认为这是一个错误,其中一个对象是用覆盖的属性创建的。
var obj = {
a: 'a property',
b: 'another property',
c: 'yet another property',
a: 'woah we have another a?'
}
在Nodejs中,我保证第二个包含字符串'woah we have another a?'
的属性始终会影响第一个包含字符串'a property'
的属性吗?
答案 0 :(得分:3)
(尽管在实践中我从未见过以不同顺序迭代对象的情况) 以下应该在V8至少为您提供不同的顺序。
var obj = {
"first":"first",
"2":"2",
"34":"34",
"1":"1",
"second":"second"
};
for (var i in obj) { console.log(i); };
// Order listed:
// "1"
// "2"
// "34"
// "first"
// "second"
正如所讨论的here
ECMA-262未指定枚举顺序。事实上的标准是匹配 插入顺序,V8也可以,但有一个例外:
V8不保证数组索引的枚举顺序(即属性) 可以解析为32位无符号整数的名称。
记住数组索引的插入顺序会产生大量内存 开销。
虽然上面说过没有指定枚举顺序,但是在创建对象之后。我认为我们可以放心地假设插入顺序应保持一致,因为没有任何引擎可以做其他事情并改变插入顺序。
var obj = {
"first":"first",
"2":"2",
"34":"34",
"1":"1",
"second":"second",
2: "two"
};
// gives result
{ '1': '1',
'2': 'two',
'34': '34',
first: 'first',
second: 'second' }