1、概念:在js中,当运算符在运算时,如果两边数据不统一,CPU就无法计算,这时我们编译器会自动将运算符两边的数据做一个数据类型转换,转成一样的数据类型再计算,即隐式转换。
2、隐式转换规则:
- 字符串连接符+:只要两边有一个为字符串,则+为字符串连接符。
1 + 'abc' // '1abc'
- 算术连接符+:两边都是数字,或者null,boolean,undefined时,则+为算术连接符,当为null,boolean或者undefined时编译器先调用Number()将其转换成数值类型。
1 + null // 1 1 + Number(null)
1 + undefined // NaN 1 + Number(undefined)
1 + true //2 1 + Number(true)
- 关系运算符:当关系运算符两边一边是字符串时,另一边不是字符串时,会先调用Number()将字符串转换成数值类型;当两边都是字符串时,调用charCodeAt方法转成成Unicode编码字符串再进行比较,如果多个字符串,则从左往右一次对比
'2' > 10 //false
'2' > '10' //true
true > '0' //true
'abc' > 'b' //false
null == null //true
undefined == null //true
undefined == undefined //true
- 复杂类型转换:先使用valueOf获取原始值,如果原始值不是number类型,则使用toString方法转换成字符串类型,再将string转换成number运算。当类型相同时,直接比较,引用类型比较的地址值。
[] == true //false
[1] == true //true
[1,2] == '1,2' //true
注意:==才会进行类型隐式转换,===先比较类型是否相同,不同则直接返回false