遍历对象属性

新手上路,请多包涵
var obj = {
    name: "Simon",
    age: "20",
    clothing: {
        style: "simple",
        hipster: false
    }
}

for(var propt in obj){
    console.log(propt + ': ' + obj[propt]);
}

变量 propt 如何表示对象的属性?它不是内置的方法或属性。为什么它会产生对象中的每个属性?

原文由 Rafay 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 558
1 个回答

迭代属性需要这个额外的 hasOwnProperty 检查:

 for (var prop in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, prop)) {
        // do stuff
    }
}

这是必要的,因为对象的原型包含对象的附加属性,这些属性在技术上是对象的一部分。这些附加属性继承自基本对象类,但仍然是 obj 的属性。

hasOwnProperty 只是检查这是否是该类特有的属性,而不是从基类继承的属性。


也可以通过对象本身调用 hasOwnProperty

 if (obj.hasOwnProperty(prop)) {
    // do stuff
}

但是如果对象有一个不相关的同名字段,这将失败:

 var obj = { foo: 42, hasOwnProperty: 'lol' };
obj.hasOwnProperty('foo');  // TypeError: hasOwnProperty is not a function

这就是为什么通过 Object.prototype 调用它更安全的原因:

 var obj = { foo: 42, hasOwnProperty: 'lol' };
Object.prototype.hasOwnProperty.call(obj, 'foo');  // true

原文由 user2417527 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题