摘要:第二是,由于會遍歷整個原型鏈,所以當(dāng)原型鏈過長時,會對性能造成影響??偨Y(jié)建議養(yǎng)成過濾屬性的好習(xí)慣,不要對運行環(huán)境做任何假設(shè),也無論原生的原型對象是否被擴展。
如同 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 設(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 對象篇(三) : 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)時就會遇到問題。
建議養(yǎng)成 hasOwnProperty 過濾屬性的好習(xí)慣,不要對運行環(huán)境做任何假設(shè),也無論原生的原型對象是否被擴展。
參考http://bonsaiden.github.io/JavaScript-Garden/#object.forinloop
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/78049.html
摘要:遍歷為了達到最佳性能來遍歷一個數(shù)組,最好的方式就是使用經(jīng)典的循環(huán)。盡管屬性是定義在數(shù)組本身的,但是在循環(huán)的每一次遍歷時仍然會有開銷。給屬性賦值一個更小的數(shù)將會截斷數(shù)組,如果賦值一個更大的數(shù)則不會截斷數(shù)組。 盡管數(shù)組在 Javascript 中是對象,但是不建議使用 for in 循環(huán)來遍歷數(shù)組,實際上,有很多理由來阻止我們對數(shù)組使用 for in 循環(huán)。 因為 for in 循環(huán)將會枚...
摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
因為最近有博友反饋我的博文是直接翻譯的參考鏈接內(nèi)的內(nèi)容,所以我在這里要說明一下,以免引起不必要的誤會。 首先,我很喜歡 segmentfault 的交流和學(xué)習(xí)的氛圍,所以我很愿意在這里跟各位 SFer 交流學(xué)習(xí)心得,相互學(xué)習(xí),共同進步。 第二,我做技術(shù)方面的工作不久,所以學(xué)習(xí)經(jīng)歷也不是很長,但是我發(fā)現(xiàn)寫博客,總結(jié)自己的學(xué)習(xí)心得是個很好的學(xué)習(xí)習(xí)慣,至少對于我個人而言,我于此收益頗豐,所以我決定堅持一...
閱讀 9345·2021-11-18 10:02
閱讀 2644·2019-08-30 15:43
閱讀 2683·2019-08-30 13:50
閱讀 1409·2019-08-30 11:20
閱讀 2732·2019-08-29 15:03
閱讀 3655·2019-08-29 12:36
閱讀 948·2019-08-23 17:04
閱讀 644·2019-08-23 14:18