即使在 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,只是一个副本。
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,只是一个副本。