與in操作符相比,for in 在循環對象的屬性時也會遍歷原型鏈,for in 不會讀取不可枚舉屬性,如數組的length屬性。 小結 當檢測某個對象是否擁有某個屬性時,hasOwnProperty 是唯一可以完成這一任務的方法,在 for in 循環時,建議增加 hasOwnProperty 進行判斷,可以有效避免擴展本地原型而引起的錯誤。
與in操作符相比,for in 在循環對象的屬性時也會遍歷原型鏈,for in 不會讀取不可枚舉屬性,如數組的length屬性。
復制代碼 代碼如下:
// 擴展 Object.prototype
Object.prototype.bar = 1;
var foo = {moo: 2};
for(var i in foo) {
console.log(i); // 輸出 bar 和 moo
}
復制代碼 代碼如下:
// 仍舊針對上例的foo對象
for (var i in foo) {
if (foo.hasOwnProperty(i)) {
console.log(i);
}
}
復制代碼 代碼如下:
// 擴展 Object.prototype
Object.prototype.bar = 1;
var foo = {goo: undefined};
foo.bar; // 1
'bar' in foo; // true
foo.hasOwnProperty('bar'); // false
foo.hasOwnProperty('goo'); // true
復制代碼 代碼如下:
var foo = {
hasOwnProperty: function() {
return false;
},
bar: 'Here be dragons'
};
foo.hasOwnProperty('bar'); // 總是返回 false
// 使用另一個 hasOwnProperty 并將 this 設置為 foo 來調用它
{}.hasOwnProperty.call(foo, 'bar'); // true
新聞熱點
疑難解答
圖片精選