根据description of the Object.keys
on MDN:
Object.keys返回一个数组,其元素是与直接在对象上找到的可枚举属性相对应的字符串。 属性的顺序与通过手动循环对象的属性给出的顺序相同。
它包括以下示例:
// array like object with random key ordering
var an_obj = { 100: "a", 2: "b", 7: "c"};
alert(Object.keys(an_obj)); // will alert "2, 7, 100"
但根据定义,密钥应按照100, 2, 7
按照它们插入对象的顺序打印,而不是2, 7, 100
。
请告诉我,Object.key
中密钥的排序方式。
答案 0 :(得分:5)
我想你可能误解了这个:
属性的顺序与通过手动循环对象的属性给出的顺序相同。
这意味着Object.keys中属性的顺序与执行for-in循环的顺序相同。
比较这些结果:
var an_obj = { 100: "a", 2: "b", 7: "c"};
//using object.keys...
console.log(Object.keys(an_obj));
//using a manual loop...
for(var k in an_obj) { console.log(k); }
您会发现这两者的顺序相同。
答案 1 :(得分:3)
JavaScript对象是无序的键值对。如果要迭代它们,Object.keys
将按照返回的顺序返回对象的键数组,但它不能保证结果与插入顺序相关的顺序。
答案 2 :(得分:2)
对象根据定义(参见规范:http://www.ecma-international.org/publications/standards/Ecma-262.htm)无序。因此无论您如何进行输入,都无法保证按键的顺序。如果您希望维护订单,您应该按照密钥的顺序保留一个单独的列表。
答案 3 :(得分:0)
我正在解释这些之间的区别:
Object.keys(obj)
for(var key in obj){
console.log(key);
}
相似:
两者都以相同的顺序返回键。这些之间没有一个区别。
<强>解释强>
如果您的对象中有数字键,那么
如果对象不包含任何数字键,则两个技巧都会跟随插入顺序。
示例:强>
var sec_obj = {0:"0", "d":23, "r": "a", "a": "b", "7": "c","z":23, 23:23};
//using object.keys...
console.log(Object.keys(sec_obj));
//using a manual loop...
for(var k in sec_obj) { console.log(k); }
<强>结果强>
["0", "7", "23", "d", "r", "a", "z"]
0
7
23
d
r
a
z
答案 4 :(得分:-1)
正如MDN文章所做的那样,提及Object.keys
的局限性非常重要。它建议使用getOwnPropertyNames
。 MDN文章还显示了浏览器支持。