if(obj.length===+obj.length){
for(vari=0,length=obj.length;i
if(iterator.call(context,obj[i],i,obj)===breaker)
return;
}
}
源碼如上,請(qǐng)注意if判斷,看上去很奇怪很難懂溯革,先把這句話的意思表達(dá)一起,如果換一種寫(xiě)法你肯定就會(huì)明白了羡玛,其實(shí)這句話等價(jià)于另外一種寫(xiě)法 :
if(typeofobj.length===“number”&&!isNaN(obj.length))
看上去這樣寫(xiě)似乎更能夠讓人看懂,而且也能達(dá)到效果宗苍,但為什么作者要這樣寫(xiě)呢稼稿,接下來(lái)我們需要關(guān)注兩個(gè)地方:
第一個(gè)就是‘===’,全等符號(hào)
第二個(gè)就是‘+’ 加號(hào)
先說(shuō)一下全等號(hào)的作用讳窟,在一般的if判斷中让歼,我們更多的是使用‘==’,這種模式比如if(2 == ‘2’)丽啡,這時(shí)候我們得到的返回結(jié)果為true谋右,但在‘===’,這種模式下补箍,我們得到的結(jié)果是false改执。這是因?yàn)槿确?hào)是不會(huì)將比較的對(duì)象進(jìn)行類(lèi)型轉(zhuǎn)換的。
再說(shuō)一下‘+’坑雅,在此處說(shuō)所起到的作用,你可以動(dòng)手做一個(gè)實(shí)驗(yàn)辈挂,在控制臺(tái)中執(zhí)行下面這句話+’2’,你可以看到返回值為數(shù)字類(lèi)型的2,其實(shí)不難理解裹粤,’+’號(hào)其實(shí)是將后面跟的操作數(shù)轉(zhuǎn)型成了數(shù)字類(lèi)型终蒂。
我們?cè)谑窍胍幌伦髡哌@樣寫(xiě)的目的,如果obj是一個(gè)string類(lèi)型,如”abc”,我們可以拿到length屬性拇泣,如果是一個(gè)function噪叙,或者一個(gè)數(shù)組,我們都可以拿到他們的length屬性霉翔,但如果是一個(gè)object類(lèi)型的數(shù)據(jù)睁蕾,它可能是不包含length屬性的。對(duì)于非數(shù)組早龟、非字符串惫霸、非函數(shù)類(lèi)型的數(shù)據(jù)猫缭,我們可以嘗試使用for
in循環(huán)來(lái)遍歷數(shù)據(jù)葱弟。這樣看來(lái)其實(shí)作者這樣的寫(xiě)法,更是想能區(qū)分?jǐn)?shù)組類(lèi)型的數(shù)據(jù)或者類(lèi)數(shù)組數(shù)據(jù)如字符串等猜丹。