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

标签 javascript

我们使用 for in 来迭代对象,如下所示

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

for (var key in object) {
   var element = object[key];
}

我看到我的前辈建议我在实际访问该属性之前检查该属性是否存在。为什么?因为如果 for in 给了我一个 key ,则意味着它存在......

为什么我应该像下面这样写for in:

for (var key in object) {
    if (object.hasOwnProperty(key)) {
        var element = object[key];            
    }
}

最佳答案

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

查看示例

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);
   }
}

看,在检查了 hasOwnProperty 后,我们传递了来自原型(prototype) (c) 的 key

关于javascript - 使用 for-in 迭代对象时是否需要检查 hasOwnProperty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45712482/

相关文章:

javascript - 在 z 轴(z 索引)中绕另一个元素旋转

javascript - 如何告诉 .hover() 等待?

javascript - 如何在IE中以其原始平滑度显示图像

javascript - 创建一个 javascript "hasValue"util 方法

javascript - 如何在不使用库的情况下将默认名称 "Select file"更改为 "Select document"?

javascript - 尝试通过指令更新模型但无法添加类

javascript - 覆盖困难的 View 模型

javascript - 从底部到顶部旋转 Div

javascript - 从返回 "UNSPECIFIED_ERROR"的模板创建信封

javascript - 使用 onclick 渲染对象数组中的数据