隱式轉(zhuǎn)換介紹:
在js中,當(dāng)運(yùn)算符在運(yùn)算時(shí),如果兩邊數(shù)據(jù)不統(tǒng)一,CPU就無法計(jì)算,這時(shí)我們編譯器會自動(dòng)將運(yùn)算符兩邊的數(shù)據(jù)做一個(gè)數(shù)據(jù)類型轉(zhuǎn)換,轉(zhuǎn)成一樣的數(shù)據(jù)類型再計(jì)算。這種無需程序員手動(dòng)轉(zhuǎn)換,而由編譯器自動(dòng)轉(zhuǎn)換的方式就稱為隱式轉(zhuǎn)換。
例如1 > "0"這行代碼在js中并不會報(bào)錯(cuò),編譯器在運(yùn)算符時(shí)會先把右邊的"0"轉(zhuǎn)成數(shù)字0`然后在比較大小js中的不同的數(shù)據(jù)類型之間的比較轉(zhuǎn)換規(guī)則如下:
1. 對象和布爾值比較
對象和布爾值進(jìn)行比較時(shí),對象先轉(zhuǎn)換為字符串,然后再轉(zhuǎn)換為數(shù)字,布爾值直接轉(zhuǎn)換為數(shù)字
[] == true; //false []轉(zhuǎn)換為字符串'',然后轉(zhuǎn)換為數(shù)字0,true轉(zhuǎn)換為數(shù)字1,所以為false
2. 對象和字符串比較
對象和字符串進(jìn)行比較時(shí),對象轉(zhuǎn)換為字符串,然后兩者進(jìn)行比較。
[1,2,3] == '1,2,3' // true [1,2,3]轉(zhuǎn)化為'1,2,3',然后和'1,2,3', so結(jié)果為true;
3. 對象和數(shù)字比較
對象和數(shù)字進(jìn)行比較時(shí),對象先轉(zhuǎn)換為字符串,然后轉(zhuǎn)換為數(shù)字,再和數(shù)字進(jìn)行比較。
[1] == 1; // true `對象先轉(zhuǎn)換為字符串再轉(zhuǎn)換為數(shù)字,二者再比較 [1] => '1' => 1 所以結(jié)果為true
4. 字符串和數(shù)字比較
字符串和數(shù)字進(jìn)行比較時(shí),字符串轉(zhuǎn)換成數(shù)字,二者再比較。
'1' == 1 // true
5. 字符串和布爾值比較
字符串和布爾值進(jìn)行比較時(shí),二者全部轉(zhuǎn)換成數(shù)值再比較。
'1' == true; // true
6. 布爾值和數(shù)字比較
布爾值和數(shù)字進(jìn)行比較時(shí),布爾轉(zhuǎn)換為數(shù)字,二者比較。
true == 1 // true
- 案列:
字符串連接符與算術(shù)運(yùn)算符隱式轉(zhuǎn)換規(guī)則混淆
如:
console.log(1+'true') // 1true
console.log(1+true) // 2
console.log(1+undefined) // NaN
console.log(1+null) // 1
原理分析:
- 1、將字符串連接符+: 會把其他數(shù)據(jù)類型調(diào)用String()返回專場字符串然后拼接。
- 2、算術(shù)運(yùn)算符+:會把其他數(shù)據(jù)類型調(diào)用Number()方法轉(zhuǎn)成數(shù)字后在做加法計(jì)算。
console.log(1+'true') // 1true
上面的+是字符串連接符: String(1) + 'true' = '1true'。
console.log(1+true) // 2
上面的+ 是算術(shù)運(yùn)算符: 1 + Number(true) = 1 + 1 = 2。
console.log(1+undefined) // NaN
上面的+ 是算術(shù)運(yùn)算符: 1 + Number(undefined) = 1 + NaN = NaN。
console.log(1+null)
上面的+ 是算術(shù)運(yùn)算符:1 + Number(null) = 1 + 0 = 1
關(guān)系運(yùn)算符:會把其他數(shù)據(jù)類型轉(zhuǎn)換成number之后再比較關(guān)系
console.log('2' > 10) // fasle
console.log('2' > '10') // true
console.log('abc' > 'b') // false
console.log('abc' > 'aad') // true
console.log(NaN == NaN) // false
console.log(undefined == null) // true
null == null // true
null === null // true
undefined == undefined // true
undefined === undefined // true
原理分析:
- 當(dāng)關(guān)系運(yùn)算符兩邊有一邊是字符串的時(shí)候,會將其他類型數(shù)據(jù)使用Number()轉(zhuǎn)換,然后比較。
console.log('2' > 1) // false Number('2') > 10 => 2 > 10 => false
- 當(dāng)關(guān)系運(yùn)算符兩邊都是字符串的時(shí)候,此時(shí)同時(shí)轉(zhuǎn)成Number然后比較關(guān)系。
此時(shí)并不是按照Number() 的形式轉(zhuǎn)成數(shù)字,而是按照字符串對應(yīng)的nuicode編碼來轉(zhuǎn)成數(shù)字。
使用這個(gè)方法可以查看字符的unicode編碼:字符串的charCodeAt()
console.log('2' > '10') // true '2'.charCodeAt() > '10'.charCodeAt()
多個(gè)字符串從左往右一次比較
console.log('abc' > 'b') // false 先比較'a' 和 'b', 'a' 與 ’b‘不相等 直接出結(jié)果
console.log('abc' > 'aab') // true 先和’a‘ 和 ’a‘ 比較,兩者相等,則繼續(xù)比較。
復(fù)雜數(shù)據(jù)類型隱式轉(zhuǎn)化是先轉(zhuǎn)String,在轉(zhuǎn)number運(yùn)算

console.log([1,2] == '1,2') // true
console.log([1,2] === '1,2') // false
邏輯非隱式轉(zhuǎn)換與關(guān)系運(yùn)算符隱式轉(zhuǎn)換搞混淆
[] == 0 // true
[] === 0 // false
![] == 0 // true
![] === 0 // false
[] == ![] // true
[] == [] // false
{} == !{} // false
{} == {} // false
原理分析:
- 1、關(guān)系運(yùn)算符: 將其他數(shù)據(jù)類型轉(zhuǎn)成數(shù)字
- 2、邏輯非: 將其他數(shù)據(jù)類型使用Boolean()轉(zhuǎn)成布類型
以下八種情況轉(zhuǎn)為布爾類型false類型:
0 ,-0, NaN, undefined, null , '', false, document.all()
其余全是true。
[] == 0 // true
- a、[],valueOf().toString() 得到空字符串。
- b、Number('') == 0 // 成立。
![] == 0 // true
本質(zhì)是 ![]邏輯fei表達(dá)式結(jié)果 與 0 比較的關(guān)系。
* a、邏輯非 優(yōu)先級高于關(guān)系運(yùn)算非 ![] = false
* b、false == 0