js隱式轉(zhuǎn)換的規(guī)則

隱式轉(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)算

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

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

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