Javascript 即使在对Object.keys()进行操作时,array.sort()是否已就位?

Javascript 即使在对Object.keys()进行操作时,array.sort()是否已就位?,javascript,arrays,sorting,javascript-objects,in-place,Javascript,Arrays,Sorting,Javascript Objects,In Place,JavaScript数组的.sort()方法修改数组并返回对数组的引用 Object.keys(obj)获取一个数组,其中包含对象的所有键obj 在JavaScript中,标准中规定了对象键不按任何特定顺序排列 因此这两个“规则”似乎是冲突的:“array.sort()已就位”与“对象键未排序” 调用Object.keys(obj.sort()时会发生以下哪种情况 对象的关键点已在适当位置排序,如果对象未修改,则保持排序 是否创建并排序对象键数组的临时匿名副本 还有别的吗 这是在标准中记录的

JavaScript数组的
.sort()
方法修改数组并返回对数组的引用

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

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

因此这两个“规则”似乎是冲突的:“
array.sort()
已就位”与“对象键未排序”

调用
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很可能会创建对象数组的临时匿名副本并对其进行排序。

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


声明
Object.keys
的结果值每次都必须是数组的新实例。这意味着生成的数组不是由对象的实际键支持的,它不像Java,它只是一个副本。

这是基于假设、逻辑和经验,还是实际记录了这样的工作方式?我想要一个很好的规范参考,因为我知道在不同的实现中事情是确定的。@hippietrail好吧,你可以看看规范:。是的,答案是正确的。谢谢你指出医生。我有时注意到了这个事实。我所做的是创建一个新对象,并按字母顺序插入键,以确保键已排序的对象。我认为这是最有效的方法。@stanleyxu2005这是有效的,但不要忘记,对象的属性不能保证保持顺序。(尽管现在所有浏览器都保留插入顺序)。您可以看一看这个类,它按照规范保持条目顺序。浏览器之外还有越来越多的小型实现,因此如果有人发现没有这样做,我们现在可以很容易地指出它们是如何不遵守标准的。@stanleyxu2005:除非它们没有遵守标准。浏览器可以任意对键进行重新排序。根本没有“键已排序的对象”。object.keys返回的数组与对象属性没有链接,因此您可以对其执行任何操作,对象属性保持其顺序。