js型別轉換

happy137發表於2019-02-12

js屬於弱型別語言,型別轉換髮生的非常頻繁。這篇文章主要總結js的各種型別之間的轉換。js包含的型別有7種,分別是Null、Undefined、String、Number、Boolean、Symbol、Object。

型別轉換規則

- Boolean Number String
Null false 0 'null'
Undefined false NaN 'undefined'
Number +0、-0、NaN(false) - '1'
String ''(false) toNumber -
Boolean - false(0);true(1) 'true'/'false'
Symbol true TypeError 'Symbol()'

表格描述了值型別的轉換。關於Object型別會單獨講解。

toBoolean

  • 只有null、undefined、+0、-0、NaN、''這幾個值強制轉換為Boolean型別時,會轉換為false。其餘的都會轉換為true。

toNumber

三種轉化方式

  • Number()
  • parseInt()
  • parseFloat()

型別轉化結果

  • null轉換為Number型別為0
  • undefined會轉化為NaN。
  • Boolean型別的false會轉化為0,true轉化為1。
  • Symbol型別轉化為Number會報錯。
  • String型別
    • Number()
      // 1. 空字串轉化為0
      Number('') // 0
      // 2. 包含有效的Number表示格式(正負值,整數、浮點數、進位制數、科學記數法),會轉換為對應的十進位制
      Number('-1') // -1
      Number('011') // 11
      Number('1.1') // 1.1
      Number('0xa') // 10
      Number('1e1') // 10
      // 3. 其餘的會轉化為NaN
      Number('aaa') // NaN
      Number('111aaa') // NaN
      複製程式碼
    • parseInt()
      // 1. 空字串轉化為NaN
      parseInt('') // NaN
      // 2. 從第一個非空格字串開始,遇到第一個非數字字元為止(包括小數點)
      parseInt(' 111aaa') // 111
      parseInt('111.1') // 111
      // 3. 在不傳入第二引數的情況下,只支援16進位制字首'0x',也不支援科學記數法
      parseInt('0xa') // 10
      parseInt('1e1') // 1
      // 4. 第二引數可以支援進位制轉換
      parseInt('AF', 16) // 175
      // 5. 其餘的轉換為NaN
      複製程式碼
    • parseFloat()
      // 1. 可以識別科學記數法及第一個有效小數點
      parseFloat('1e1') // 10
      parseFloat('12.12.3') // 12.12
      // 2. 直接把原字串作為十進位制解析,不會引入其他進位制
      parseFloat('0xa') // 0
      // 3. 其餘規則與parseInt()相同
      複製程式碼

toString

  • null => 'null'
  • undefined => 'undefined'
  • true => 'true', false => 'false'
  • 1 => '1', 100000000000000000000000 => '1e+23'(極小和極大的數字使用指數形式)

物件轉換為基本型別

物件轉換為基本型別通過自動呼叫[Symbol.toPrimitive](hint)、toString()、valueOf()三種方法實現。

[Symbol.toPrimitive](hint)

  • 優先順序最高,若定義了該函式,發生型別轉換時會優先呼叫該函式
  • hint(轉換型別)取值有3個:'string','number','default'(代表不確定)
  • 必須返回一個基本型別值,否則報錯

toString()、valueOf()

  • 若沒有[Symbol.toPrimitive](hint)方法,則會呼叫toString或者valueOf方法
  • hint為string,則只會呼叫toString方法
  • hint為number,則會先呼叫valueOf方法,再根據valueOf方法的返回值判斷是否需要呼叫toString方法。

運算子型別轉換

四則運算子

只有加法運算時,其中一方是字串型別,才會把另一個也轉換為字串型別。其他的運算只要其中一方是數字,另一方就會轉換為數字。

1 + '1' // '11'
1 * '2' // 2
'a' + + 'b' // 'aNaN'
複製程式碼

==

  • '=='和'==='運算子的區別是'=='允許在相等比較中進行強制型別轉換,'==='不允許
  • 一方為數字,另一方為字串,則將字串轉化為數字再比較
  • 如果有一方是Boolean型別,則先將其轉換為數字再比較
  • null和undefined相等,與其他均不相等
    null == undefined // true
    null == false // false
    undefined == 0 // false
    複製程式碼
  • 一方是物件,另一方是String或者Number時,將物件按照上述物件轉換為基本型別的規則轉換
  • 示例
    '0' == false // true
    '0' == NaN // false
    '0' == 0 // true
    '0' == '' // false
    
    false == 0 // true
    false == '' // true
    false == [] // true
    false == {} // false
    
    '' == 0 // true
    '' == [] // true
    '' == {} // false
    
    0 == [] // true
    0 == {} // false
    0 == '\n' // true
    
    [] == ![] // true
    '' == [null] // true
    複製程式碼

相關文章