[] == ![] 为什么是true?
== 在进行比较的时候会进行强制转换,转换规则如下:
流程:
1、首先会判断两者类型是否相同,相同的话就比较两者的大小
2、类型不相同的话,就会进行类型转换
3、会先判断是否在对比 null 和 undefined ,是的话就返回true
4、判断两者类型是否为 string 和 number,是的话就会将字符串转换为number
5、判断其中一方是否为boolean,是的话就会把 boolean 转为 number 再进行判断
6、判断其中一方是否为object 且另一方为 string、number、或者symbol,是的话就会把 object 转为原始类型再进行判断
Object类型转为原始类型之前,会先转为基础类型,再转换为number类型,这个过程称为ToPrimitive。
ToPrimitive过程先回检查对象是否存在valueOf方法,如果存在并且valueOf返回基本类型的值,则使用该值进行强制类型转换,如果没有,则使用toString方法返回的值进行强制类型转换。
我们来看一道今天做的题
(function () {
console.log('10' == 10); //true “10”转换为10 10==10 为true
console.log(['10'] == 10); //true ['1', '0'].toString()为"10" 字符串"10"转换为number为10 10==10 为true
console.log(['1', '0'] == 10);//false
//['1', '0'].valueOf()的值不是基础类型,所以我们使用['1', '0'].toString()的值
//['1', '0'].toString()为"1,0" 字符串"1,0"转换为number为NaN,所以NaN == 10为false。
console.log(null == 0); // false null和number 不会进行转换,直接为false
console.log('null' == 0); // false //字符串'null'转化为number为NaN, NaN == 1 为false
console.log(['null'] == 0); // false
// ['null'].valueOf()的值不是基础类型,所以我们使用['null'].toString()的值
// 然后变成"null",字符串"null"再转化为number为NaN,所以NaN == 1 为false。
console.log(true == 1); //true true布尔类型转化为1 1==1 为true
console.log('true' == 1); // false 字符串'true'转化为number为NaN, NaN == 1 为false
console.log(['true'] == 1); //false
// ['true'].valueOf()的值不是基础类型,所以我们使用['true'].toString()的值
// 然后变成"true",字符串"true"再转化为number为NaN,所以NaN == 1 为false。
//==遇到对象怎么比较?
//判断其中一方是否为object 且另一方为 string、number、或者symbol,
//是的话就会把 object 转为原始类型再进行判断,Object类型转化为原始类型之前会先转为基础类型
// 然后再转换为number类型,这个过程叫ToPrimitive
// ToPrimitive过程先回检查对象是否存在valueOf方法,如果存在并且valueOf返回基本类型的值,则使用该值进行强制类型转换,
// 如果没有,则使用toString方法返回的值进行强制类型转换
})()
上面弄懂了我们来看[] == ![] 为什么是true
console.log([] == ![]) //true
//![]先对[]进行强制boolean转换,等价于
//=> [] == false fasle再进行强制转换为0
//=> [] == 0 [].toString()后为 "" 空字符串
//=> "" == 0 ""空字符串转换为number为0
//=> 0 == 0
//所以为 true