显示对象属性未排序

时间:2018-08-28 02:43:09

标签: javascript

我正在尝试进行测试,表明执行Object.keys(someObj)的顺序不确定。

a = {}
a.b = 1
a.c = 2
a.d = 3
Object.keys(a)
// result should be undeterministic because Objects are not ordered

但是,无论我怎么做,结果始终是['b', 'c', 'd']

如何获得结果的某些差异?示例['d', 'c', 'b']

3 个答案:

答案 0 :(得分:2)

  

如何获得结果的差异

安装并使用旧版本的网络浏览器。

所有现代浏览器都保留插入顺序; es6 SetMap也保留插入顺序;如果需要确保这种行为,可以使用其中一种来分别跟踪密钥。

答案 1 :(得分:1)

通过ECMA-262,您会发现很多情况下规范中的内容与引擎的实际功能不匹配。

在大多数情况下(例如这种情况),引擎仍然符合规范。无法证明引擎没有使用属性键的不确定性排序。

在其他情况下,引擎可能会偏离规范sometimes drastically

我认为这里最重要的要点是,不应真正尝试测试不确定性行为*。 ECMA-262的官方测试套件提供了一些很好的示例,说明如何测试各种疯狂行为。 https://github.com/tc39/test262/tree/master/test/built-ins/Object/keys

*您可以进行模糊测试等,但这超出了本主题的范围。

答案 2 :(得分:0)

使用数字键很容易看到它,由于某种原因,当我在至少2个浏览器中通过Object.keys()进行传递时,会对其进行数字排序

const o ={
   '3':3,
   '1':1,
   '2':2
}

console.log(Object.keys(o))// ['1','2','3']