類型系統(tǒng)按照「是否允許隱式類型轉(zhuǎn)換」來分類卖子,可以分為強類型和弱類型捏题。TypeScript 是弱類型缝裤。
數(shù)學運算符中的類型轉(zhuǎn)換
由于JS并沒有類型聲明,所以任意兩個變量或字面量铜靶,都可以做加減乘除叔遂。
1. 減、乘、除
我們在對各種非 Number 類型運用數(shù)學運算符 (減已艰、乘痊末、除)時,會先將非 Number 類型轉(zhuǎn)換為 Number 類型哩掺。
1 - true // 0凿叠, 首先把 true 轉(zhuǎn)換為數(shù)字 1, 然后執(zhí)行 1 - 1
1 - null // 1, 首先把 null 轉(zhuǎn)換為數(shù)字 0嚼吞, 然后執(zhí)行 1 - 0
1 * undefined // NaN, undefined 轉(zhuǎn)換為數(shù)字是 NaN
2 * ['5'] // 10盒件, ['5']首先會變成 '5', 然后再變成數(shù)字 5
2. 加法的特殊性
加法要區(qū)別對待,因為JS中的+還可以用來拼接字符串舱禽。
- 當一側(cè)為 String 類型履恩,會被識別為字符串拼接,并會優(yōu)先將另一側(cè)轉(zhuǎn)換為字符串類型呢蔫。
- 當一側(cè)為 Number 類型切心,另一側(cè)為原始類型,會將原始類型轉(zhuǎn)換為 Number 類型片吊。
- 當一側(cè)為 Number 類型绽昏,另一側(cè)為引用類型,將引用類型和 Number 類型轉(zhuǎn)換成字符串后拼接俏脊。
123 + '123' // 123123 (規(guī)則1)
123 + null // 123 (規(guī)則2)
123 + true // 124 (規(guī)則2)
123 + {} // 123[object Object] (規(guī)則3)
邏輯語句中的類型轉(zhuǎn)換
當我們使用 if while for 語句時全谤,我們期望表達式是一個 Boolean,所以一定伴隨著隱式類型轉(zhuǎn)換爷贫。
1. 單個變量
如果只有單個變量认然,會先將變量轉(zhuǎn)換為 Boolean 值。
只有 null undefined '' NaN 0 false 這幾個是 false漫萄,其他的情況都是 true卷员,比如 {} , []。
2. 使用 == 比較中的 5 條規(guī)則
- NaN 和其他任何類型相比 永遠返回 FALSE (包括和他自己)
NaN == NaN // false
NaN === NaN // false
- Boolean 和其他任何類型比較腾务,Boolean 首先被轉(zhuǎn)換為 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 轉(zhuǎn)換為 Number 類型。
123 == '123' // true, '123' 會先變成 123
'' == 0 // true, '' 會首先變成 0
- null == undefined 比較結(jié)果為 true密末,除此之外握爷,null宰啦、undefined 和其他任何結(jié)果的比較值都為 FALSE。
null == undefined // true
null == '' // false
null == 0 // false
null == false // false
undefined == '' // false
undefined == 0 // false
undefined == false // false
- 原始類型和引用類型做比較時饼拍,引用類型會依照 ToPrimitive 規(guī)則轉(zhuǎn)換為原始類型赡模。
ToPrimitive 規(guī)則,是引用類型向原始類型轉(zhuǎn)變的規(guī)則师抄,它遵循先 valueOf 后 toString 的模式期望得到一個原始類型漓柑。
如果還是沒法得到一個原始類型,就會拋出 TypeError叨吮。
'[object Object]' == {}
// true, 對象和字符串比較辆布,對象通過 toString 得到一個基本類型值
'1,2,3' == [1, 2, 3]
// true, 同上 [1, 2, 3]通過 toString 得到一個基本類型值
練習
- [] == ![]
- 第一步,![] 會變成 false
- 第二步茶鉴,應(yīng)用 規(guī)則2 锋玲,題目變成: [] == 0
- 第三步,應(yīng)用 規(guī)則5 涵叮,[]的valueOf是0惭蹂,題目變成: 0 == 0
- 所以, 答案是 true 割粮!//
- [undefined] == false
- 第一步盾碗,應(yīng)用 規(guī)則5 ,[undefined]通過toString變成 '',
題目變成 '' == false
- 第二步舀瓢,應(yīng)用 規(guī)則2 廷雅,題目變成 '' == 0
- 第三步,應(yīng)用 規(guī)則3 京髓,題目變成 0 == 0
- 所以航缀, 答案是 true !
// 但是 if([undefined]) 又是個true堰怨!
附錄:類型轉(zhuǎn)換表
https://chinese.freecodecamp.org/news/javascript-implicit-type-conversion/