我們?cè)敿?xì)講解了JavaScript中的自動(dòng)類(lèi)型轉(zhuǎn)換,由于篇幅限制,沒(méi)能覆蓋到所有的轉(zhuǎn)換規(guī)則,這次準(zhǔn)備詳細(xì)講解一下。

上次我們提到了對(duì)象類(lèi)型參與運(yùn)算時(shí)轉(zhuǎn)換規(guī)則:

1). 在邏輯環(huán)境中執(zhí)行時(shí),會(huì)被轉(zhuǎn)換為true

2). 在字符串環(huán)境和數(shù)字環(huán)境中,它的valueOf()方法和toString()方法會(huì)依次被調(diào)用,然后根據(jù)返回值進(jìn)行再次轉(zhuǎn)換。首先,valueOf()方法會(huì)被調(diào)用,如果其返回值是基礎(chǔ)類(lèi)型,則將這個(gè)返回值轉(zhuǎn)為目標(biāo)類(lèi)型,如果返回值不是基礎(chǔ)類(lèi)型,則再試圖調(diào)用toString()方法,然后將返回值轉(zhuǎn)型。如果最終的返回值不是基礎(chǔ)類(lèi)型,則轉(zhuǎn)型會(huì)拋出一個(gè)異常,如果是基礎(chǔ)類(lèi)型,則會(huì)相應(yīng)的轉(zhuǎn)為字符串或數(shù)字。

接著上次的講,當(dāng)加號(hào)“+”作為一元操作符應(yīng)用在對(duì)象類(lèi)型上面時(shí),valueOf()和toString()方法,將會(huì)有機(jī)會(huì)被調(diào)用,最終返回值會(huì)被轉(zhuǎn)為數(shù)字類(lèi)型,我們因而會(huì)得到一個(gè)數(shù)字或NaN。先來(lái)看看valueOf()和toString()的調(diào)用順序:

var o = {
    valueOf: function() {        return '3';
    },
    toString: function() {        return '5';
    }
};var foo = +o;

console.log(foo);    // 3

可以看到,valueOf()方法被調(diào)用,返回了字符串類(lèi)型的'3',然后被轉(zhuǎn)為數(shù)字類(lèi)型的3,而toString()方法并沒(méi)有被調(diào)用,我們?cè)俅我瞥齰alueOf()方法:

var o = {
    toString: function() {        return '5';
    }
};var foo = +o;

console.log(foo);    // 5

這時(shí)候toString()方法就被調(diào)用了,根據(jù)其返回值'5',對(duì)象被成功轉(zhuǎn)為了數(shù)字5。

估計(jì)很多初學(xué)者都會(huì)覺(jué)得,如果定義了valueOf()方法,就去調(diào)用valueOf()方法,如果沒(méi)定義,就去調(diào)用toString()方法,其實(shí)是不準(zhǔn)確的。

實(shí)際上,valueOf()方法總會(huì)在第一時(shí)間被調(diào)用,至于toString()方法的調(diào)用與否,那得看valueOf()方法的返回值了,我們上面也提到了,如果其返回值是基礎(chǔ)類(lèi)型,那么toString()方法根本沒(méi)有機(jī)會(huì)被調(diào)

網(wǎng)友評(píng)論