強制轉換
使用 Number()
String()
Boolean
手動轉換
Number()
// 数值:转换后还是原来的值
Number(324) // 324
// 字符串:如果可以被解析为数值,则转换为相应的数值
Number('324') // 324
// 字符串:如果不可以被解析为数值,返回 NaN
Number('324abc') // NaN
// 空字符串转为0
Number('') // 0
// 布尔值:true 转成 1,false 转成 0
Number(true) // 1
Number(false) // 0
// undefined:转成 NaN
Number(undefined) // NaN
// null:转成0
Number(null) // 0
和parseInt的區別:parseInt是逐個解析,而Number只要遇到有一個字符不能轉成數,就會被轉為NaN
相同:都會去掉前導和空格
parseInt('42 cats') // 42
Number('42 cats') // NaN
遇到對象
只有包含單個數字的數組可以被轉換,其餘都是NaN
Number({a: 1}) // NaN
Number([1, 2, 3]) // NaN
Number([5]) // 5
記住對象轉換成基本數據類型的步驟:valueOf()
-> toString()
在這裡不必走完,任一有值就可以返回
- 在Number中,如果valueOf返回原始類型的值,直接對該值使用Number,然後返回
譬如Number([5])
- 如果valueOf返回對象,就調用toString,返回基本類型的值就進行轉換,然後返回
valueOf()
和toString()
都返回對象 -> 報錯
var obj = {x: 1};
Number(obj) // NaN
// 等同于
if (typeof obj.valueOf() === 'object') {
Number(obj.toString());
} else {
Number(obj.valueOf());
}
String()
和Number差不多
String(123) // "123"
String('abc') // "abc"
String(true) // "true"
String(undefined) // "undefined"
String(null) // "null"
遇到對象
valueOf()
-> toString()
Number()
是valueOf()
/toString()
Boolean
除了五種,其他都是true
- undefined
- null
- 0 (+0 / -0)
- NaN
- '' (空字符串)
Boolean(undefined) // false
Boolean(null) // false
Boolean(0) // false
Boolean(NaN) // false
Boolean('') // false
所有對象轉成布爾值都是true,包含false布爾對象new Boolean(false)
出於性能考量,避免對象計算得值
自動轉換
- 運算符 +
123 + 'abc' // "123abc"
- 對非布爾值求布爾值
if('abc') { console.log('hello') } // hello // 或是 !'abc' // false !!'abc' // true
- 對非數值類型使用一元運算符
一般是轉換正負號
+ {foo: 'bar'} // NaN
- [1, 2, 3] // NaN
null转为数值时为0,而undefined转为数值时为NaN。