类型转换的三种结果
- 转换为数字
- 转换为字符串
- 转换为布尔值
强制类型转换
转换为数字
Number():将非数值转换为数值
- Boolean值,true转换为1,false转换为0
Number(true) // 1
Number(false) // 0
- String类型
- 字符串中只包含数字转换为十进制数
- 字符串中只包含浮点数转换为浮点数
- 字符串中包含十六进制数,转换为十进制
- 空字符串转换为0
- 其他转换为NaN
- Object
- 先调用valueOf()方法:如果返回原始值,在原始值的基础上使用Nmuber()方法, 如果返回复合对象,继续调用toString(),如果toString(),返回复合对象,则转换失败,报错
- null -> 0
- undefined -> NaN
parseInt():将字符串转换为数值(数组除外)
- 会从第一个非空字符开始转换,即会忽略开头的空格
- 除了字符串之外的值都转换为NaN
- 空字符串转换为NaN
- 0开头的字符串转换为八进制,0x字符串转换为十六进制
- 如果是数组,取数组的第一个元素进行类型转换
parseInt('hello') // NaN
parseInt('') //NaN
parseInt(' 22.5') // 22
parseInt(' 22.5blue') // 22
parseInt(' fdaf22.5blue') // NaN
parseInt('070') // es5会返回56 es6会返回70 解决办法如下
parseInt('0xf') // 15
parseInt([1,2,3,'4']) // 1
parseInt(['1',2,3,'4']) // 1
parseInt(['22.5blue',2,3,'4']) // 22
- 为parseInt(),传入第二个参数,表示转换后的进制
parseInt('070',10) // 70
parseInt('070',8) // 56
parseFloat():将字符串转换为数值
与parseInt()的行为基本相同
转换为字符串
toString()
- Boolean值转化为相应的'true'、'false'
- Number转换为相应的字符串
- null、undefined会报错
- 复杂数据类型:调用对应的内置的或重写的toString()
var obj = {}
obj.toString() // "[object Object]"
String()
- 行为与toString()基本相同
- 不同:String(null) -> 'null';String(undefined) -> 'undefined';
转换为Boolean
null, undefined, false, '', 0,+0,-0,NaN转换为false,其他都转换为true。
隐式类型转换
&&、||、!、条件判断语句中,隐式转换为Boolean
四则运算
加法 +
- 两边都是数字,进行的加法运算
- 一边是数字,一边是字符串,进行的字符串拼接
- 其他情况,转换为字符串再进行处理
减法、乘法、除法
- 首先调用Number()进行转换,然后进行减、乘、除运算
- 如果Number方法返回了NaN,那么运算结果为NaN
关系运算符
>=、<=、 >、 <
- 两侧都是数值,进行数值比较
- 两侧都是字符串,进行字符编码比较
- 其他的先进行Number()转换,然后进行比较
- 如果Number()比较一侧出现了NaN,则返回false (原因:NaN和任何类型比较包裹NaN本身都返回false)
==
- null == undefined
- 一侧是string,另一侧是number,会将字符串转换为number
- 一侧是boolean,那么会转换为number
- NaN不和任何之相等包括NaN本身
- 一侧是Object,另一侧为string或者number,就会把object转换为原始类型
- 如果部署了[Symbol.toPrimitive] 接口,首先调用[Symbol.toPrimitive] 接口,如果返回的是基础类型结束,如果返回的不是抛出错误
- 如果没有部署[Symbol.toPrimitive] 接口,先调用valueOf()如果返回了NaN,那么继续调用toString()
- 如果两边都是对象,判断它是否指向同一个对象。
##练习题
true + false //1
12 / '6' //2
'number' +18 +9 // 'number189'
15+3+'number' // '18number'
[1] > null // true
[1] > undefined // false
'foo' + +'bar' // 'fooNaN'
'true' == true //false
false == 'false' //false
null == '' // false
!!"false" == !!"true" //true
["x"] == "x" // true
[] + null + 1 // 'null1' TODO
[1,2,3] == [1,2,3] //false
{} + [] + {} + [1] // '0[object Object]1'
! + [] + [] + ![] // 'truefalse'
new Date(0) - 0 //0
new Date(0) + 0 //'Thu Jan 01 1970 08:00:00 GMT+0800 (中国标准时间)0'
[] == ![]
[] == false
0 == 0