规范:Section 11.9.3, The Abstract Equality Algorithm
规则
由规范概括出的比较规则:
如果其中一个操作数为
Number
类型,另一个操作数为String
类型,则先将字符串转为Number
类型再比较如果其中一个操作数为
Boolean
类型,则在比较相等性之前,将其转换为Number
类型如果其中一个操作数为
Object
类型,另一个操作数为String
或Number
类型,则将Object
类型的操作数转为基本类型(ToPrimitive)NaN
与任何类型的操作数比较都返回false
(包括自身)如果两个操作数都是为
Object
类型,则比较它们是不是同一个对象。如果指向同一个对象(指向同一个内存地址),则返回true
其他特殊情况:
null == undefined
返回true
+0 == -0
返回true
例:[] == ![]
!
操作符优先级高于==
,先执行!
操作:
1 | [] == false |
满足上述第2
条规则,将Boolean类型的操作数转换为Number类型:
1 | [] == Number(false) |
得到:
1 | [] == 0 |
满足上述第3
条规则,将Object
类型的操作数转为基本类型:
1 | ToPrimitive([]) == 0 |
toPrimitive()函数是如何执行的,
先调用[].valueOf()
,结果是[]
,不是基本类型,所以继续调用[].toString()
,结果是""
,是基本类型,返回""
。
得到:
1 | "" == 0 |
满足上述第1
条规则,将字符串转为Number
类型:
1 | Number("") == 0 |
最后得到:
1 | 0 == 0 // true |
例:{} == !{}
1 | {} == false |