for in 不能循環動態屬性 this.xxx
for in 忽略原型 prototype;
for in 能夠循環原型鏈(__proto__.p1
);
for in 忽略被覆蓋的鏈屬性(__proto__.p4&5
)
for in 忽略 enumerable: undefined|null|false|0
總之:忽略動態,忽略原型,忽略被覆蓋的鏈屬性及不可枚舉的屬性this
hasOwnProperty 能夠過濾原型鏈 proto
hasOwnProperty 不能夠過濾 enumerable 爲真的屬性spa
function F() { this.p0 = 'this.p0'; } F.__proto__.p1 = 'f.__proto__.p1'; //鏈屬性沒有被覆蓋 F.p2 = 'f.p2'; F.prototype.p3 = 'f.prototype.p3'; //原型屬性 F.__proto__.p4 = 'f.__proto__.p4'; //鏈屬性被下面的 p4 覆蓋 Object.defineProperty(F, 'p4', {value: 'defineProperty enumerable: undefined'}); Object.defineProperty(F, 'p5', {value: 'defineProperty enumerable: true', enumerable: true}); F.__proto__.p5 = 'f.__proto__.p5'; //鏈屬性被上面的 p5 覆蓋 for (var k in F) { console.log('hasOwnProperty:', F.hasOwnProperty(k), '\t', k, '->', F[k]); }