国产探花免费观看_亚洲丰满少妇自慰呻吟_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 過濾屬性的好習慣,不要對運行環境做任何假設,也無論原生的原型對象是否被擴展。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 容城县| 汪清县| 通辽市| 观塘区| 萨迦县| 盐边县| 长葛市| 南昌市| 杭州市| 荥阳市| 吉首市| 叙永县| 古田县| 衢州市| 榆社县| 玉门市| 临高县| 铜山县| 合阳县| 黑龙江省| 高要市| 拜城县| 卢龙县| 黄山市| 维西| 额敏县| 沧源| 清涧县| 麻江县| 曲松县| 达孜县| 武夷山市| 凤城市| 剑河县| 耿马| 永年县| 盐池县| 麟游县| 仁怀市| 延吉市| 兰考县|