Nodejs属性保证

时间:2015-06-18 22:46:06

标签: node.js properties

注意:我使用的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'的属性吗?

1 个答案:

答案 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' }