引申:1.var a =[0] if(a) console.log(a==true) ; a=[2];a==true; //打印结果为false
2. var b = 2 ;if(b) console.log(b==true) // 打印结果为false
一下表格反应了当进行A==B判断是进行的操作,一下内容来自https://developer.mozilla.org
被比较值 B | |||||||
---|---|---|---|---|---|---|---|
Undefined | Null | Number | String | Boolean | Object | ||
被比较值 A | Undefined | true |
true |
false |
false |
false |
IsFalsy(B) |
Null | true |
true |
false |
false |
false |
IsFalsy(B) |
|
Number | false |
false |
A === B |
A === ToNumber(B) |
A=== ToNumber(B) |
A=== ToPrimitive(B) |
|
String | false |
false |
ToNumber(A) === B |
A === B |
ToNumber(A) === ToNumber(B) |
ToPrimitive(B) == A |
|
Boolean | false |
false |
ToNumber(A) === B |
ToNumber(A) === ToNumber(B) |
A === B |
ToNumber(A) == ToPrimitive(B) | |
Object | false | false | ToPrimitive(A) == B |
ToPrimitive(A) == B |
ToPrimitive(A) == ToNumber(B) |
|
在上面的表格中,ToNumber(A)
尝试在比较前将参数 A 转换为数字,这与 +A(单目运算符+)的效果相同。ToPrimitive(A)
通过尝试调用 A 的A.toString()
和 A.valueOf()
方法,将参数 A 转换为原始值(Primitive)。
一般而言,根据 ECMAScript 规范,所有的对象都与 undefined
和 null
不相等。但是大部分浏览器允许非常窄的一类对象(即,所有页面中的 document.all
对象),在某些情况下,充当效仿 undefined
的角色。相等操作符就是在这样的一个背景下。因此,IsFalsy(A)
方法的值为 true
,当且仅当 A
效仿 undefined
。在其他所有情况下,一个对象都不会等于 undefined
或 null
。
由此理解 1中 a在条件语句中会通过Boolean函数转为true 或者false,而在判断中首先调用 a的valueOf方法,然后调用toString方法,再将他们都转换为Number,a被转换为0,true被装换为1,而后来a被转换为2,
在2中,数值与Boolean比较,都将其转换为数值类型再比较
so 只要跟Number或者Boolean类型比较,都会将等式两边都转换为Number
全等不经过任何类型转换的基础上判断是否相等