最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Javascript學習筆記之 對象篇(四) : for in 循環(huán)

 更新時間:2014年06月24日 09:12:10   投稿:hebedich  
如同 in 運算符一樣,使用 for in 循環(huán)遍歷對象屬性時,也將往上遍歷整個原型鏈。

先上范例:

// Poisoning Object.prototype
Object.prototype.bar = 1;

var foo = {moo: 2};
for(var i in foo) {
 console.log(i); // prints both bar and moo
}

這里我們要注意兩點,一是 for in 循環(huán)會忽略 enumerable 設置為 false 的屬性。例如一個數(shù)組的 length 屬性。第二是,由于 for in 會遍歷整個原型鏈,所以當原型鏈過長時,會對性能造成影響。

 enumerable 是個很陌生的詞匯,實際上,你很難在 javascript 中發(fā)現(xiàn)它的影子,而它實際上也是作者從 ruby 中借鑒而來的。創(chuàng)建 enumerable 的目的不是為了獨立使用,而是采用“混用”的方式,而 Prototype 中很多方法都混用了 enumerable,所以它可以說是 prototype 的奠基石。這里不做詳細介紹,詳細內容可以參考 - Enumerable。
由于我們沒法改變 for in 循環(huán)本身的行為,所以我們只能采取其他方法來過濾掉那些不希望出現(xiàn)在循環(huán)內的屬性,通過 《Javascript學習筆記之對象篇(三) : hasOwnProperty》 我們知道 hasOwnProperty 方法是可以做到這一點的。

使用 hasOwnProperty 過濾

仍然使用上個例子:

// Poisoning Object.prototype
Object.prototype.bar = 1;

var foo = {moo: 2};
 for(var i in foo) {
 if (foo.hasOwnProperty(i)) {
  console.log(i);
 }
 }

這是唯一正確的寫法,由于我們實用了 hasOwnProperty 方法,所以這次只輸出 moo。如果不適用 hasOwnProperty 方法,那么當 Object.prototype 擴展時,就會出現(xiàn)錯誤。
現(xiàn)在很多框架都會選擇從 Object.prototype 擴展方法,所以我們使用這些框架時,如果使用沒有用 hasOwnProperty 過濾的 for in 循環(huán)時就會遇到問題。

總結

建議養(yǎng)成 hasOwnProperty 過濾屬性的好習慣,不要對運行環(huán)境做任何假設,也無論原生的原型對象是否被擴展。

相關文章

最新評論

尖扎县| 喀喇沁旗| 鄯善县| 军事| 伊金霍洛旗| 湘西| 尼勒克县| 孝昌县| 兴隆县| 泊头市| 洮南市| 凤山市| 象州县| 赤城县| 松江区| 宁海县| 文登市| 万宁市| 江川县| 五台县| 汽车| 新晃| 巴塘县| 丰顺县| 沾化县| 那坡县| 毕节市| 白玉县| 奇台县| 随州市| 苏州市| 玛纳斯县| 朔州市| 怀来县| 淄博市| 奉贤区| 富阳市| 宿松县| 沐川县| 封丘县| 福贡县|