JS隱式類型轉(zhuǎn)換規(guī)則

JavaScript中,類型轉(zhuǎn)換只有三種:
1、轉(zhuǎn)換成數(shù)字
2、轉(zhuǎn)換成布爾值
3、轉(zhuǎn)換成字符串

1、加法運(yùn)算操作符

加號(hào)運(yùn)算操作符在Javascript可以做為數(shù)字的相加,也用于字符串連接符,所以要特別注意。其轉(zhuǎn)換規(guī)則是:\color{red}{當(dāng)加號(hào)兩邊都是數(shù)字的時(shí)候執(zhí)行加法,否則一律連接}。所以加號(hào)操作符的規(guī)則分種情況:

\color{red}{(1)如果有一側(cè)為String類型}

加法運(yùn)算在這種情況下,如果有一側(cè)為String類型,則將另一側(cè)轉(zhuǎn)換為字符串,最后連接起來。
注意:對(duì)象,數(shù)組,函數(shù),布爾, 則先調(diào)用toString()方法取得字符串值,調(diào)用其valueOf()方法,然后在拼接到一起。對(duì)于undefined和null,分別調(diào)用String()顯式轉(zhuǎn)換為字符串。

console.log('1' + 2) // '12'
console.log('1' + {}) // '1[object Object]' 等價(jià)于 console.log('1' + {}.toString());
console.log('1' + []) // '1' 空數(shù)組執(zhí)行toString()方法后被轉(zhuǎn)義成空字符串
console.log('1' + ['1','2','a']) // '11','2','a'
console.log('1' + function(){}) //'1function(){}'
console.log('1' + true) // '1true'
console.log('1' + undefined) // '1undefined' 等價(jià)于 console.log('1' + String(undefined));
console.log('1' + null) // '1null'
console.log('1' + NaN) // '1NaN'

\color{red}{(2)如果有一側(cè)是Number類型,另一側(cè)是原始類型,則將元素類型轉(zhuǎn)換成Number類型}

console.log(1 + 1) // 2
console.log(1 + true) // 2
console.log(1 + null) // 1

\color{red}{(3)如果有一側(cè)是Number類型,另一側(cè)為引用類型,將引用類型和Number類型轉(zhuǎn)換成字符串后拼接。}

console.log(1 + {}) // '1[object Object]'
console.log(1 + []) // '1'
console.log(1 + [1,2,3]) // '11,2,3'

\color{red}{以上 3 點(diǎn),優(yōu)先級(jí)從高到低}

下邊的是一些特殊情況。

console.log(1 + NaN) // 'NaN'
console.log('1' + NaN) // '1NaN'
console.log({} + NaN) // NaN
console.log({} + []) // 0
console.log([] + []) // ''
console.log({} + {}) // '[object Object][object Object]'

2、減號(hào)(-)運(yùn)算符、乘除(*, /)、取模運(yùn)算符(%)

這些操作符針對(duì)的是運(yùn)算,所以他們具有共同性:如果操作值之一不是數(shù)值,則被隱式調(diào)用Number()函數(shù)進(jìn)行轉(zhuǎn)換??梢钥闯?,這里必須的搞懂各種類型調(diào)用Number()函數(shù)后的結(jié)果。

console.log('2' - 1) // 1
console.log('2' - {}) // NaN
console.log(2 * ['10']) // 20  ['10']首先會(huì)變成 '10', 然后再變成數(shù)字 10

3、邏輯語句中的類型轉(zhuǎn)換

比如if,for,while循環(huán),其表達(dá)式結(jié)果往往是一個(gè)Boolean類型,這時(shí)候就會(huì)出現(xiàn)js的隱式類型轉(zhuǎn)換。

(1)單個(gè)變量時(shí)候,會(huì)先將變量轉(zhuǎn)換為Boolean值

轉(zhuǎn)換規(guī)則是:只有 null undefined '' NaN 0 false 這幾個(gè)是 false,其他的情況都是 true,比如 {} , []。

(2)使用 == 比較的情況,有5種情況

\color{red}{1)NaN和其他任何類型比較永遠(yuǎn)返回false,包括和他自己}

NaN == 0 //false
NaN == NaN  //false

$\color{red}{2)Boolean 和其他任何類型比較,Boolean 首先被轉(zhuǎn)換為 Number 類型。</font>

true == 1 // true
true == ['1']  // true  true會(huì)轉(zhuǎn)換成1,['1']會(huì)拆解成'1',在參考下邊的規(guī)則3
true == ['1','2']  // false  
false == undefined //false 首先 false 變成 0,然后參考規(guī)則4
false == null //false 

\color{red}{3)String和Number比較,先將String轉(zhuǎn)換為Number類型}

'1' == 1 // true
'' == 0  // true  ''會(huì)轉(zhuǎn)變成0

\color{red}{4)null == undefined比較結(jié)果是true,除此之外,null、undefined和其他任何結(jié)果的比較值都為false}

null == undefined // true
null == 0  // false 
null == false  // false 
undefined == 0  // false 
undefined == false  // false 

\color{red}{5)原始類型和引用類型做比較時(shí),引用類型會(huì)依照ToPrimitive規(guī)則轉(zhuǎn)換為原始類型}

什么是ToPrimitive規(guī)則?

JS引擎內(nèi)部轉(zhuǎn)換為原始值ToPrimitive(obj,preferredType)函數(shù)接受兩個(gè)參數(shù),第一個(gè)obj為被轉(zhuǎn)換的對(duì)象,第二個(gè)preferredType為希望轉(zhuǎn)換成的類型(默認(rèn)為空,接受的值為Number或String)在執(zhí)行ToPrimitive(obj,preferredType)時(shí)如果第二個(gè)參數(shù)為空并且obj為Date的實(shí)例時(shí),此時(shí)preferredType會(huì)被設(shè)置為String,其他情況下preferredType都會(huì)被設(shè)置為Number.

如果preferredType為Number,ToPrimitive執(zhí)行過程如下:

1、如果obj為原始值,直接返回;
2、否則調(diào)用 obj.valueOf(),如果執(zhí)行結(jié)果是原始值,返回之;
3、否則調(diào)用obj.toString(),如果執(zhí)行結(jié)果是原始值,返回之;
4、否則拋異常。

如果preferredType為String,將上面的第2步和第3步調(diào)換,即:

1、如果obj為原始值,直接返回;
2、否則調(diào)用obj.toString(),如果執(zhí)行結(jié)果是原始值,返回之;
3、否則調(diào)用 obj.valueOf(),如果執(zhí)行結(jié)果是原始值,返回之;
4、否則拋異常。

1 == {} // false
0 == [] // true
'1,2' == [1, 2 ] //true [1, 2]通過 toString 得到一個(gè)基本類型值
'[object Object]' == { name: '小坦克'} //true 
'[object Object]' == {  } //true 

今天就是中秋節(jié)啦,提前祝大家新年快樂!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容