js中有两种等于比较,“==”和“===”,其实“==”涉及到隐式类型转换,转换的规则分两种情况
同种类型
在类型相同的基础上,tyepof (x)来判断,对应的值有 string,boolean,number,object,function,undefined,隐式转换的规则如下
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