js 中有两种等于比较,“” 和 “=”,其实 “==” 涉及到隐式类型转换,转换的规则分两种情况

同种类型

在类型相同的基础上,tyepof(x) 来判断,对应的值有 string,boolean,number,object,function,undefined,隐式转换的规则如下

  1. 都是 undefined 或者 null,返回 true
undefined == undefined;
null == null;
undefined == null;
  1. 都是 number,只有相同数字和(+0,-0)为 true,其他为 false
100 == 100 // true
+0 == -0  // true
Infinity == Infinity // true
+100 == -100 // false
NaN == NaN    // false
NaN == 100  // false
  1. 都是 string,只有长度,字符串相同返回 true,其他为 false
  2. 都是 object,指向同一个引用为 true,其他为 false

不同类型

  1. 字符串 vs 数字,字符串转数字再比较
  2. 布尔值 vs 其他,布尔值转数字再比较
  3. 字符串或者数字 vs 对象,对象转为原始值再比较
    对象转原始值有两个方法 valueOf() 和 toString(),例如使用 String(obj) 会调用 toString() 来返回值,使用 Number(obj) 会调用 valueOf() 来返回值
    默认对象的 valueOf() 返回对象本身,toString() 返回的是字符串[object Object],我们可以重写对应方法返回不同的值
    在比较时候对象调用相应的方法获取对应的值,例如有一个对象
var obj = {
num: 24,
name: 'kobe',
toString: function () {
return this.name;
},
valueOf: function () {
return this.num;
},
};
console.log([obj].join() == 'kobe');
console.log(obj == 24);

根据上面的规则,来看看下面的例子

[] == false

判断的步骤如下

  1. object == number => [] == 0

  2. string == number => "" == 0

  3. number == number => 0 == 0

结果是 true

![] == false

在 js 中,!表达式只有以下几种情况返回 true

null,undefined,0,NaN,"",false,其他都是

所以 ![] == false 结果是 true