在Object.keys()

时间:2015-05-13 17:06:45

标签: javascript object for-loop properties

考虑这个对象:var obj = {10: 0, 11: 1, 12: 2};

使用方法Object.keys(obj),您可以看到obj有三个键:10,11,12。

但是,如果您想迭代每个键(例如,为了获取每个键的值),标准for循环将返回正确的键,但是" for"风格没有。有谁知道这里发生了什么?是否可以使用"来获取正确的键名称?"?

JSFiddle:http://jsfiddle.net/n7sm22kb/

2 个答案:

答案 0 :(得分:4)

在您的具体示例中,这是因为Object.keys返回一个数组。 for ... inObject.keys执行非常相似的操作,因此您正在迭代键的键,因此您的问题就会出现。

您可以通过运行来看到这一点:

var obj = {10: 0, 11: 1, 12: 2};
var keys = Object.keys(obj); // ['10', '11', '12'];
for (var key in keys) {
  console.log('Keys has', keys[key], 'at', key);
}

使用for ... in的正确等效词更像是:

for(var key in obj) {
  if (obj.hasOwnProperty(key)) {
    console.log(obj[key]);
  }
}

您可以看到此处介绍的额外复杂性。

for ... in (#12.6.4 in the spec)遍历对象中的所有可枚举属性,包括从原型继承的属性,导致它包含许多您可能需要过滤掉的东西。在数组的情况下,它循环遍历数组中每个项的属性名称(即数组索引)。这是你遇到问题的第二层间接问题。

Object.keys (#15.2.3.14 in the spec)被定义为仅从对象本身检索密钥(“对于每个自己的可枚举属性...”),从而节省了对该检查的需要。

如果可能,在大多数情况下更喜欢Object.keys,因为它可以节省您的逻辑。如果[].forEach可用,您也可以使用:

Object.keys(obj).forEach(function (key) {
  console.log('Object has', obj[key], 'at', key);
});

答案 1 :(得分:0)

我怀疑@jlewkovich 想使用

for (key of Object.keys(obj)) {

而不是:

for (key in Object,keys(obj)) {

注意of而不是in。我这么说是因为我在犯了那个错误后找到了这个页面。

PS:我尝试将其添加为评论,但没有声誉点,因此请原谅我认为评论更合适的新答案。 @ssube 回答了这个问题。这是对我认为作者会想问的另一个问题的回答。