JavaScript 遍历对象属性和原型链

JavaScript iterating over object properties and the prototype chain

MDN 状态:

Also, when iterating over the properties of an object, every enumerable property that is on the prototype chain will be enumerated.

所以我尝试了这个:

var x = {a: "I am a"};
var z = Object.create(x);

for( i in z )
{
    console.dir( i );

    if( i == "hasOwnProperty" ) {
        console.log( 'found hasOwnProperty' );
    }
}

只输出 a 但不输出 hasOwnProperty。为什么?

因为Object.prototype.hasOwnProperty是不可枚举的:

Object.getOwnPropertyDescriptor(Object.prototype, 'hasOwnProperty')
  .enumerable // false

因此,它不会被 for...in 循环迭代。

因为 hasOwnProperty 是不可枚举的,你可以使用

来测试它
console.log(Object.getOwnPropertyDescriptor(Object.prototype, "hasOwnProperty").enumerable)

如上所述,对象的每个 属性 都有一个 'enumerable' 标志。当标志设置为 false 时,属性 将不会在遍历对象属性时被枚举。

Object.prototype.hasOwnProperty 是 non-enumerable 这意味着 'enumerable' 标志设置为 false。

你可以阅读我写的关于这个话题的文章here来加深你的知识。