類型系統(tǒng)按照「是否允許隱式類型轉換」來分類,可以分為強類型和弱類型。TypeScript 是弱類型。
數學運算符中的類型轉換
由于JS并沒有類型聲明,所以任意兩個變量或字面量,都可以做加減乘除。
1. 減、乘、除
我們在對各種非 Number 類型運用數學運算符 (減、乘、除)時,會先將非 Number 類型轉換為 Number 類型。
1 - true // 0, 首先把 true 轉換為數字 1, 然后執(zhí)行 1 - 1
1 - null // 1, 首先把 null 轉換為數字 0, 然后執(zhí)行 1 - 0
1 * undefined // NaN, undefined 轉換為數字是 NaN
2 * ['5'] // 10, ['5']首先會變成 '5', 然后再變成數字 5
2. 加法的特殊性
加法要區(qū)別對待,因為JS中的+還可以用來拼接字符串。
- 當一側為 String 類型,會被識別為字符串拼接,并會優(yōu)先將另一側轉換為字符串類型。
- 當一側為 Number 類型,另一側為原始類型,會將原始類型轉換為 Number 類型。
- 當一側為 Number 類型,另一側為引用類型,將引用類型和 Number 類型轉換成字符串后拼接。
123 + '123' // 123123 (規(guī)則1)
123 + null // 123 (規(guī)則2)
123 + true // 124 (規(guī)則2)
123 + {} // 123[object Object] (規(guī)則3)
邏輯語句中的類型轉換
當我們使用 if while for 語句時,我們期望表達式是一個 Boolean,所以一定伴隨著隱式類型轉換。
1. 單個變量
如果只有單個變量,會先將變量轉換為 Boolean 值。
只有 null undefined '' NaN 0 false 這幾個是 false,其他的情況都是 true,比如 {} , []。
2. 使用 == 比較中的 5 條規(guī)則
- NaN 和其他任何類型相比 永遠返回 FALSE (包括和他自己)
NaN == NaN // false
NaN === NaN // false
- Boolean 和其他任何類型比較,Boolean 首先被轉換為 Number 類型。
true == 1 // true
true == '2' // false, 先把 true 變成 1,而不是把 '2' 變成 true
true == ['1'] // true, 先把 true 變成 1, ['1']拆箱成 '1', 再參考規(guī)則3
true == ['2'] // false, 同上
undefined == false // false ,首先 false 變成 0,然后參考規(guī)則4
null == false // false,同上
- String 和 Number 比較,先將 String 轉換為 Number 類型。
123 == '123' // true, '123' 會先變成 123
'' == 0 // true, '' 會首先變成 0
- null == undefined 比較結果為 true,除此之外,null、undefined 和其他任何結果的比較值都為 FALSE。
null == undefined // true
null == '' // false
null == 0 // false
null == false // false
undefined == '' // false
undefined == 0 // false
undefined == false // false
- 原始類型和引用類型做比較時,引用類型會依照 ToPrimitive 規(guī)則轉換為原始類型。
ToPrimitive 規(guī)則,是引用類型向原始類型轉變的規(guī)則,它遵循先 valueOf 后 toString 的模式期望得到一個原始類型。
如果還是沒法得到一個原始類型,就會拋出 TypeError。
'[object Object]' == {}
// true, 對象和字符串比較,對象通過 toString 得到一個基本類型值
'1,2,3' == [1, 2, 3]
// true, 同上 [1, 2, 3]通過 toString 得到一個基本類型值
練習
- [] == ![]
- 第一步,![] 會變成 false
- 第二步,應用 規(guī)則2 ,題目變成: [] == 0
- 第三步,應用 規(guī)則5 ,[]的valueOf是0,題目變成: 0 == 0
- 所以, 答案是 true !//
- [undefined] == false
- 第一步,應用 規(guī)則5 ,[undefined]通過toString變成 '',
題目變成 '' == false
- 第二步,應用 規(guī)則2 ,題目變成 '' == 0
- 第三步,應用 規(guī)則3 ,題目變成 0 == 0
- 所以, 答案是 true !
// 但是 if([undefined]) 又是個true!
附錄:類型轉換表

https://chinese.freecodecamp.org/news/javascript-implicit-type-conversion/