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

同种类型

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

1. 都是undefined或者null,返回true

undefined == undefined
null == null 
undefined == null

2. 都是number,只有相同数字和(+0,-0)为true,其他为false

100 == 100 // true
+0 == -0  // true
Infinity == Infinity // true
+100 == -100 // false
NaN == NaN    // false
NaN == 100  // false

3. 都是string,只有长度,字符串相同返回true,其他为false
4. 都是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