Javascript學(xué)習(xí)筆記之 對象篇(四) : 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 設(shè)置為 false 的屬性。例如一個數(shù)組的 length 屬性。第二是,由于 for in 會遍歷整個原型鏈,所以當(dāng)原型鏈過長時,會對性能造成影響。
enumerable 是個很陌生的詞匯,實際上,你很難在 javascript 中發(fā)現(xiàn)它的影子,而它實際上也是作者從 ruby 中借鑒而來的。創(chuàng)建 enumerable 的目的不是為了獨立使用,而是采用“混用”的方式,而 Prototype 中很多方法都混用了 enumerable,所以它可以說是 prototype 的奠基石。這里不做詳細介紹,詳細內(nèi)容可以參考 - Enumerable。
由于我們沒法改變 for in 循環(huán)本身的行為,所以我們只能采取其他方法來過濾掉那些不希望出現(xiàn)在循環(huán)內(nèi)的屬性,通過 《Javascript學(xué)習(xí)筆記之對象篇(三) : 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 方法,那么當(dāng) Object.prototype 擴展時,就會出現(xiàn)錯誤。
現(xiàn)在很多框架都會選擇從 Object.prototype 擴展方法,所以我們使用這些框架時,如果使用沒有用 hasOwnProperty 過濾的 for in 循環(huán)時就會遇到問題。
總結(jié)
建議養(yǎng)成 hasOwnProperty 過濾屬性的好習(xí)慣,不要對運行環(huán)境做任何假設(shè),也無論原生的原型對象是否被擴展。
相關(guān)文章
簡介JavaScript中toTimeString()方法的使用
這篇文章主要介紹了簡介JavaScript中toTimeString()方法的使用,是JS入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-06-06
使用?Next.js?Cli?快速搭建和運行?Web?應(yīng)用
這篇文章主要介紹了使用?Next.js?Cli?快速搭建和運行?Web?應(yīng)用,需要的朋友可以參考下2024-04-04
設(shè)計模式中的facade外觀模式在JavaScript開發(fā)中的運用
外觀模式通過引入一個外觀角色來簡化客戶端與子系統(tǒng)之間的交互,為復(fù)雜的子系統(tǒng)調(diào)用提供一個統(tǒng)一的入口,降低子系統(tǒng)與客戶端的耦合,接下來就來看設(shè)計模式中的facade外觀模式在JavaScript開發(fā)中的運用2016-05-05
JavaScript實現(xiàn)關(guān)鍵字高亮功能
關(guān)鍵詞高亮技術(shù)各大CMS基本上都有,但基本都是后端代碼來實現(xiàn)的,今天我們探討下如何使用javascript來實現(xiàn)代碼高亮技術(shù)。2014-11-11
JS不用正則驗證輸入的字符串是否為空(包含空格)的實現(xiàn)代碼
下面小編就為大家?guī)硪黄狫S不用正則驗證輸入的字符串是否為空(包含空格)的實現(xiàn)代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-06-06

