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

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

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

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

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

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

console.log(foo);    // 3

可以看到,valueOf()方法被調(diào)用,返回了字符串類型的'3',然后被轉(zhuǎn)為數(shù)字類型的3,而toString()方法并沒有被調(diào)用,我們再次移除valueOf()方法:

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

console.log(foo);    // 5

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

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

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