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()相同 複製程式碼
- Number()
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 複製程式碼