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