使用for-in迭代对象时,是否需要检查hasOwnProperty?

Vik*_*sal 0 javascript

我们使用for in如下迭代对象

var object = { "a":"foo", "b":"bar"}

for (var key in object) {
   var element = object[key];
}
Run Code Online (Sandbox Code Playgroud)

我见过我的老年人建议我在实际访问之前检查属性是否存在.为什么?因为如果一个for in给我一把钥匙就意味着它存在......

我为什么要这样写for in:

for (var key in object) {
    if (object.hasOwnProperty(key)) {
        var element = object[key];            
    }
}
Run Code Online (Sandbox Code Playgroud)

Sur*_*yan 5

如果只想要该对象的属性,则需要使用hasOwnProperty函数.如果没有该检查,您还将获得从该对象的原型获得的属性.

查看示例

var object = { "a":"foo", "b":"bar"};

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

Object.setPrototypeOf(object,{ "c" : "gar"});

console.log('After setting prototype');

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

console.log('Using hasOwnProperty');

for (var key in object) {
   if(object.hasOwnProperty(key)){
      console.log(key);
   }
}
Run Code Online (Sandbox Code Playgroud)

看看,在检查之后hasOwnProperty,我们传递key来自prototype(c)的那个.