什么时隐式转换
由于js是弱类型语言,所以在进行四则运算和比较时,js将不能进行比较的类型转换为统一的类型进行比较和计算。
隐式转换的原则
对象与布尔进行数据比较
var obj =[];
var bool = false;
console.log(obj == bool);//true
var obj =[];
var bool = true;
console.log(obj == bool);//false
如上图所示,数组和布尔类型本无法比较,就是因为进行了隐式转换。当一个对象与一个数组进行比较时,他先将对象通过toString()转为字符串,再将字符串通过Number转为数字,而布尔类型则是通过Number()直接转为数字,进而比较数字是否相等。 步骤如下:
- 对象Number(obj.toString())
- 布尔Number(bool)
- Number(obj.toString())与Number(bool)进行比较
对象与字符串进行比较
var obj = ['a','b','c'];
var str = 'a,b,c'
console.log(obj == str);//true
对象与字符串进行比较,直接将数组转化为字符串进行比较 步骤如下:
- 对象obj.toString()
- obj.toString()与str进行比较
对象和数字
步骤如下:
- 对象Number(obj.toString())
- Number(obj.toString())与num进行比较
字符串与数字
步骤如下:
- Number(str)
- Number(str)与数字进行比较
字符串与布尔
步骤如下:
- Number(str)
- Number(bool)
- 两者进行比较
布尔与数字
步骤如下:
- Number(bool)
- Number(bool)与num进行比较
null与undefined
他们两个是相等的!
console.log(null == undefined);//true
在网上找了很多,还没有个准确答案,暂且认为js底层就是规定他们相等的吧。
隐式转换一大问题
console.log(NaN == NaN);//false
暂且先记录这些,后续有了解到继续补充。。。