第一眼看到这个标题,[]==![] ,估计想到的都是false吧。

但是alert([]==![]) ,会神奇的发现,它居然是true。这到底是怎么回事呢?

首先,分解一下这个表达式。

[]==![]  由以下几步完成判断。

1、求值![]

2、参考ECMAScript文档(以下简称文档)11.4.9  Logical NOT Operator ( ! ) ,!运算符首先对[]进行toBoolean([])操作,文档9.2中得知,如果参数是Object,则返回true。于是  ![] 最后 得值 false

3、表达式变为[]==false

4、参考文档11.9.3 The Abstract Equality Comparison Algorithm,根据规则,第七条 If Type(y) is Boolean, return the result of the comparison x == ToNumber(y). 由于我们的右边的是个布尔值,所以对false进行toNumber(false)操作,文档9.3 ToNumber中,可知如果是false,那么toNumber返回0

5、表达式变为[]==0

6、继续看文档11.9.3,我们来到了第九条:9. If Type(x) is Object and Type(y) is either String or Number,return the result of the comparison ToPrimitive(x) == y. 由于[]是个Object,而右侧是Number 0,所以,对左侧的[]执行toPrimitive操作,根据文档9.1的toPrimitive章节,一个object的toPrimitive操作返回值是它的[[DefaultValue]],根据文档8.12.8的第一条,由于[]存在toString方法,所以返回[].toString().

7、表达式变为”"==0

8、又一次来到文档11.9.3第五条:5. If Type(x) is String and Type(y) is Number,return the result of the comparison ToNumber(x) == y,于是对”"进行toNumber操作,于是再一次来到文档9.3及9.3.1,得知,如果是空字符串,那么toNumber返回的是0

9、表达式变为0==0

10、返回true

神奇吧!~

参考文档:ECMAScript-262 Edition 5 ,地址 http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf