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

上次我們提到了對象類型參與運算時轉換規(guī)則:

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

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

接著上次的講,當加號“+”作為一元操作符應用在對象類型上面時,valueOf()和toString()方法,將會有機會被調用,最終返回值會被轉為數字類型,我們因而會得到一個數字或NaN。先來看看valueOf()和toString()的調用順序:

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

console.log(foo);    // 3

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

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

console.log(foo);    // 5

這時候toString()方法就被調用了,根據其返回值'5',對象被成功轉為了數字5。

估計很多初學者都會覺得,如果定義了valueOf()方法,就去調用valueOf()方法,如果沒定義,就去調用toString()方法,其實是不準確的。

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

網友評論