隱式類型轉換

類型系統(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ī)則

    1. NaN 和其他任何類型相比 永遠返回 FALSE (包括和他自己)
NaN == NaN // false
NaN === NaN // false
    1. 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,同上
    1. String 和 Number 比較,先將 String 轉換為 Number 類型。
123 == '123' // true, '123' 會先變成 123
'' == 0 // true, '' 會首先變成 0
    1. 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
    1. 原始類型和引用類型做比較時,引用類型會依照 ToPrimitive 規(guī)則轉換為原始類型。

ToPrimitive 規(guī)則,是引用類型向原始類型轉變的規(guī)則,它遵循先 valueOf 后 toString 的模式期望得到一個原始類型。

如果還是沒法得到一個原始類型,就會拋出 TypeError。

'[object Object]' == {} 
// true, 對象和字符串比較,對象通過 toString 得到一個基本類型值
'1,2,3' == [1, 2, 3] 
// true, 同上  [1, 2, 3]通過 toString 得到一個基本類型值

練習

  1. [] == ![]
    - 第一步,![] 會變成 false
    - 第二步,應用 規(guī)則2 ,題目變成: [] == 0
    - 第三步,應用 規(guī)則5 ,[]的valueOf是0,題目變成: 0 == 0
    - 所以, 答案是 true !//
  1. [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/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容