使用 hasOwnProperty 過濾
總結
和 in 操作符一樣,for in 循環同樣在尋找物件屬性時遍歷原型鏈上的所有屬性。
// 修改 Object.prototype Object.prototype.bar = 1; var foo = {moo: 2}; for(var i in foo) { console.log(i); // 输出两个属性:bar 和 moo }
由於不可能改變 for in 自身的行為,因此有必要過濾出那些不希望出現在循環體中的屬性, 這可以透過 Object.prototype 原型上的hasOwnProperty 函數來完成。
注意:for in 循環不會遍歷那些 enumerable 設定為 false的屬性;例如陣列的 length屬性。
使用 hasOwnProperty 過濾
// foo 变量是上例中的 for(var i in foo) { if (foo.hasOwnProperty(i)) { console.log(i); } }
這個版本的程式碼是唯一正確的寫法。由於我們使用了 hasOwnProperty,所以這次只輸出 moo。 如果不使用 hasOwnProperty,這段程式碼在原生物件原型(例如 Object.prototype)被擴充時可能會出錯。
一個廣泛使用的類別庫 Prototype 擴展了原生的 JavaScript 物件。 因此,當這個類別庫被包含在頁面中時,不使用 hasOwnProperty 過濾的 for in 循環難免會出問題。
注意:由於 for in 總是要遍歷整個原型鏈,因此如果一個物件的繼承層次太深的話會影響效能。
總結
建議總是使用 hasOwnProperty,不要對程式碼運作的環境做任何假設,不要假設原生物件是否已經被擴充了。
以上就是JavaScript進階系列-for in 迴圈的內容,更多相關內容請關注PHP中文網(m.sbmmt.com)!