国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

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

2019-11-20 14:24:27
字體:
來源:轉載
供稿:網友

先上范例:

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

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

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

使用 hasOwnProperty 過濾

仍然使用上個例子:

// Poisoning Object.prototypeObject.prototype.bar = 1;var foo = {moo: 2}; for(var i in foo) { if (foo.hasOwnProperty(i)) {  console.log(i); } }

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

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 广丰县| 普兰店市| 那坡县| 丽水市| 习水县| 文化| 项城市| 宜兴市| 民权县| 宾阳县| 井陉县| 平阳县| 修武县| 都江堰市| 三都| 融水| 南江县| 将乐县| 石河子市| 德化县| 夏邑县| 防城港市| 昌邑市| 宜宾市| 宁强县| 石景山区| 曲周县| 涿鹿县| 枣强县| 周宁县| 达日县| 嵊泗县| 启东市| 渝北区| 西丰县| 揭东县| 奉化市| 德州市| 乌兰浩特市| 紫金县| 台中市|