即使在 Object.keys() 上操作时,array.sort() 是否就位?

Is array.sort() in-place even when operating on Object.keys()?

JavaScript 数组的 .sort() 方法就地修改数组和 returns 对数组的引用。

Object.keys(obj) 获取一个数组,其中包含对象 obj.

的所有键

在 JavaScript 中,对象键在标准中规定为不按任何特定顺序排列。

所以这两个 "rules" 似乎有冲突:“array.sort() 就位”与 "Object keys are not ordered".

当我们调用 Object.keys(obj).sort() 时会发生以下哪项?

这是否记录在标准中,还是因实施而异?

JavaScript 中的对象没有顺序。您可以对对象的键进行排序并获得对象键的数组,但不能对对象进行排序。

var test = {'a': 12, 'c': 99, 'b': 8, 'd': 15};
console.log(Object.keys(test).sort());
// outputs: ["a", "b", "c", "d"]
// but test still remains as: Object {a: 12, c: 99, b: 8, d: 15}

Object.keys(test).sort()依次给出了"a"、"b"、"c"、"d"的数组,但是对象仍然保留在随机顺序(基于用户的浏览器)。

换句话说,当您调用Object.keys(test).sort()时,会创建对象键数组的临时匿名副本并对其进行排序,并且对象保持不变。

很可能 JS 会创建对象数组的临时匿名副本并对其进行排序。

答案是第二个:创建并排序对象键数组的临时匿名副本。

ecma spec states that the result value of Object.keys must be a new instance of an array every time. That means the resulting array is not backed by the actual keys of the object, it's not like Java's keySet,只是一个副本。