首頁  >  文章  >  web前端  >  JavaScript進階系列-for in 循環

JavaScript進階系列-for in 循環

黄舟
黄舟原創
2017-02-08 09:31:141120瀏覽

使用 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中文網(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn