關于js中類型轉換一直都沒有梳理清楚组题,這次認真梳理發(fā)現(xiàn)只有三種情況,分別為:
- 轉換為布爾值
- 轉換為字符串
- 轉換為數(shù)字
原始值 | 轉換目標 | 結果 |
---|---|---|
number | 布爾值 | 0岳悟、-0、NaN為false,其它均為true |
string | 布爾值 | 空字符串(' ')為false贵少,其它均為true |
undefined呵俏、null | 布爾值 | false |
引用類型 | 布爾值 | true |
原始值 | 轉換目標 | 結果 |
---|---|---|
number | 字符串 | 123=>'123' |
Boolean、函數(shù)滔灶、Symbol | 字符串 | function(){} => 'function(){}' |
數(shù)組 | 字符串 | [1,2,3]=>'1,2,3' |
對象 | 字符串 | '[object Object]' |
原始值 | 轉換目標 | 結果 |
---|---|---|
string | 數(shù)字 | '123'=>123 |
數(shù)組 | 數(shù)字 | 空數(shù)組[]=>0,只有一個數(shù)字元素['1']=>1,其它情況NaN |
null | 數(shù)字 | 0 |
除了數(shù)組的引用類型 | 數(shù)字 | NaN |
Symbol | 數(shù)字 | 拋錯:Uncaught TypeError: Cannot convert a Symbol value to a number |
轉Boolean
在條件判斷時普碎,除了 0、-0录平、NaN麻车、''、undefined斗这、null动猬、false其它所有值都轉為 true,包括所有對象表箭。
對象轉原始類型
對象類型轉換時會調用內置的[[ToPrimitive]] 函數(shù)赁咙,該函數(shù)算法邏輯如下:
- 如果已經是原始類型,不需要轉換
- 調用x.valueOf()免钻,如果轉換為基礎類型彼水,就返回轉換的值
- 調用x.toString(),如果轉換為基礎類型极舔,就返回轉換的值
- 如果都沒有返回原始類型凤覆,報錯
可以重寫Symbol.toPrimitive,該方法在轉換原始類型是調用優(yōu)先級最高
let a = {
valueOf () {
return 0
},
toString () {
//return '1'
},
[Symbol.toPrimitive] () {
return 2
}
}
1 + a // 3
四則運算符
加法運算符不同于其他幾個運算符拆魏,有幾個特點:
- 運算中有一方為字符串盯桦,那么另一方也轉換成字符串
- 如果一方不是字符串或者數(shù)字,那么會將它轉化為數(shù)字或者字符串
1 + '1' // '11'
true + true // 2
1+[1,2,3] // "11,2,3"
??注意這種表達式 'a' + + 'b'
'a' + + 'b' // "aNaN"
技巧:可以通過+ '1'的形式快速獲取number值渤刃,+操作符可以直接把后面的值轉成數(shù)字
對于除了加法的運算符(-俺附、*、/)溪掀,非數(shù)字的轉成數(shù)字進行運算
4 / '2' // 2
3 * '3' // 9
3 - {} // NaN
比較運算符
- 對象,通過toPrimitive方法轉換成基本類型
- 字符串步鉴,通過unicode 字符索引來比較
- 布爾值揪胃,轉換成數(shù)字,true=>1, false=>0
let a = {
valueOf() {
return 0
},
toString() {
return '2'
}
}
a > -1 // true, a 是對象氛琢,通過 valueOf 轉換為原始類型再比較值喊递。
對比== 和 ===
對于==來說,如果對比雙方的類型不同阳似,會進行類型轉換骚勘,x == y判斷流程:
- 首先判斷x、y類型是否相同,相同則直接比較大小(x === y)俏讹,不同則類型轉換繼續(xù)判斷 -->
- 若x当宴、y為null和undefined,返回true泽疆,否則繼續(xù)判斷 -->
- 若x户矢、y為字符串和數(shù)字進行比較,將字符串轉換為number殉疼,再繼續(xù)判斷
- 若x梯浪、y有一方為布爾值,是的話將布爾值轉為number瓢娜,再繼續(xù)判斷
- 判斷是否有一方為Object挂洛,且另一方為string/number/symbol,是的話將object轉換為原始類型再繼續(xù)判斷
詳情參考:標準文檔
[] == ![] // true眠砾,過程:[] == false -> [] == 0 -> 0 == 0 ->true