首頁 > web前端 > js教程 > Javascript中的for in循環和hasOwnProperty結合使用_javascript技巧

Javascript中的for in循環和hasOwnProperty結合使用_javascript技巧

WBOY
發布: 2016-05-16 17:32:46
原創
1521 人瀏覽過

與in操作符相比,for in 在循環物件的屬性時也會遍歷原型鏈,for in 不會讀取不可枚舉屬性,例如數組的length屬性。 小結 當偵測某個物件是否擁有某個屬性時,hasOwnProperty 是唯一可以完成此任務的方法,在 for in 迴圈時,建議增加 hasOwnProperty 來判斷,可以有效避免擴展本地原型而引起的錯誤。

與in運算子相比,for in 在循環物件的屬性時也會遍歷原型鏈,for in 不會讀取不可枚舉屬性,例如陣列的length屬性。

複製程式碼 程式碼如下:

// Object.prototype var foo = {moo: 2};
for(var i in foo) {
console.log(i); // 輸出bar 和moo
}


我們不可能改變for in 循環的行為,當需要對循環體內某些屬性進行過濾時,可以利用Object.prototype的hasOwnProperty方法來完成。

提示:因為 for in 迴圈總是遍歷整個原型鏈,所以當遍歷多繼承的物件時效率較低。

使用hasOwnProperty 過濾


複製程式碼複製程式碼

🎜>複製程式碼

// 仍舊針對上例的foo物件
for (var i in foo) {
if (foo.hasOwnProperty(i)) {
console.log(i);
}
}



例子中因為使用了hasOwnProperty,最終輸出moo;如果忽略hasOwnProperty ,程式碼將會輸出非預期結果,因為本地原型(如Object.prototype)已經被擴展了。

Prototype框架就是擴展Javascript原始物件的一個類別庫,並被廣泛使用,其缺點也很明顯,當框架引入後,如果不使用hasOwnProperty 進行過濾判斷,輸出結果保證不是你想要的。

最佳實踐

推薦在 for in 時,總是使用 hasOwnProperty 來判斷,沒人可以保證運行的程式碼環境是否被污染過。

hasOwnProperty
為了檢查某個物件是否擁有不在原型鏈上的自訂屬性,就有必要用到 hasOwnProperty 方法,任何一個物件都有該方法,它繼承自 Object.prototype。

提示:我們無法完全偵測某個屬性是否為undefined,因為屬性有可能存在,但其值為undefined。 hasOwnProperty 是Javascript中唯一可以處理物件屬性而不遍歷原型鏈的方法。
複製程式碼
程式碼如下:


// ObjectObject.prototype var foo = {goo: undefined};

foo.bar; // 1
'bar' in foo; // true

foo.hasOwnProperty('bar'); // false
foo.hasOwnProperty('goo'); // true



只有hasOwnProperty 給了正確的預期結果,當遍歷物件的屬性時這是必要的,沒有其它辦法來排除定義在物件原型鏈上的屬性。

hasOwnProperty 為屬性

Javascript 並沒有保護 hasOwnProperty 為關鍵字或保留字,因此,如果某個物件擁有同名的屬性,就有必要利用擴充的 hasOwnProperty 來取得正確結果。
程式碼如下:

var foo = {has function() {
return false;
},
bar: 'Here be dragons'
};
foo.hasOwnProperty('bar'); // 總是回傳false
foo.hasOwnProperty('bar'); // 總是回傳false
// 使用另一個hasOwnProperty 並將this 設為foo 來呼叫它
{}.hasOwnProperty.call(foo, 'bar'); // true


小結
當偵測某個物件是否擁有某個屬性時,hasOwnProperty 是唯一可以完成這項任務的方法,在for in 循環時,建議增加hasOwnProperty 進行判斷,可以有效避免擴展本地原型而引起的錯誤。
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板