我正在尝试进行测试,表明执行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']
答案 0 :(得分:2)
如何获得结果的差异
安装并使用旧版本的网络浏览器。
所有现代浏览器都保留插入顺序; es6 Set
和Map
也保留插入顺序;如果需要确保这种行为,可以使用其中一种来分别跟踪密钥。
答案 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']