4

根据MDN 上的描述Object.keys

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"

但是根据定义, key 应该100, 2, 7按照它们插入对象的顺序打印,而不是2, 7, 100.

请让我知道,密钥的顺序是如何发生的Object.key

4

5 回答 5

6

我想你可能误解了这一点:

属性的顺序与通过手动循环对象的属性给出的顺序相同。

这意味着 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); }

你会发现这两个的顺序是一样的。

于 2013-06-27T16:25:15.410 回答
3

JavaScript 对象是无序的键值对。Object.keys如果您要迭代它们,则按照它们将返回的顺序返回对象的键数组,但它不保证结果的顺序与插入顺序相关。

于 2013-06-27T16:25:16.203 回答
2

对象根据定义(参见规范: http: //www.ecma-international.org/publications/standards/Ecma-262.htm)是无序的。因此,无论您如何输入,都无法保证键的顺序。如果您希望保持顺序,您应该保留一个单独的列表,其中包含键的顺序。

于 2013-06-27T16:24:16.870 回答
0

我正在解释更多关于这些之间的区别:

Object.keys(obj)

 

for(var key in obj){
    console.log(key);
}

相似之处:

两者都以相同的顺序返回键。这些之间没有任何区别。

解释:

  1. 如果您的对象中有数字键,那么

    • 所有数字键都按自然顺序排列。
    • 所有其他键都按插入顺序排列。
  2. 如果对象不包含任何数字键,则插入顺序将遵循这两个技巧。

例子:

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
于 2016-01-15T07:26:34.040 回答
-1

Object.keys正如 MDN 文章所做的那样,提及 的限制是很重要的。它建议使用getOwnPropertyNames. MDN 文章还显示了浏览器支持。

于 2014-02-16T10:37:06.280 回答