这道题说难也不难。主要考察隐式转换的一些知识。一些可能我们知道,但不常用。或者说是记忆中的模糊地带。下面就带大家看看,这道题里有哪些坑:
第一坑:运算符优先级
拿到这道题,首先你要知道,运算是从左到右,还是从右到左。
参照上图(优先级从高到底),我们得到! 优先级高于==。所以[]==![]的运算顺序是从右向左。到此第一个坑,跨过去了。
第二坑:Boolean 隐式转换规则
!(逻辑非),在javascript高级程序设计(第三版)是这样定义的
也就是说会先把[]转换为布尔值,再进去取反。这里就要设计到Boolean的转换规则:
false、""、0、NaN、null、undefined五种情况会被转换为false,其余任何值都会被转换为true。
[]不在五种情况之列,也就直接转为true了。再对其取反,可以得出[]==![]的右边为false.则现在的问题转化为判断[]==false的值。
第三坑:==遵循的原则
一句话理解
==比较先把两侧的值转化为基本数据类型,也就是Number/String/布尔。如果两个基本数据类型不同,然后将基本数据类型转化为数字进行比,较如果相同直接比较值。
回到我们的题目,跨过第二坑我们已经得到[]==false,根据上面所说的原则,当有一个操作数是布尔值时,先把该操作数转为数值,因此[]==false => []==0.
现在是空数组[]和0进行比较,那这里有什么知识点呢?请往下看
JS中简单类型与引用类型进行==比较的情况
这种比较也是有规则的,并且可以用代码来验证JS内部的执行情况。
将一个简单类型(这里指除undefined与null的值)与一个对象比较时,
先调用对象的 valueOf 方法,以期待返回一个基本数据类型的值,如果对象的 valueOf 方法返回的仍然是一个复合对象,
就接着调用对象的 toString 方法以期待返回一个基本数据类型的值,如果仍然没有返回基本数据类型的值,就判为不相等,
如果valueOf 或 toString 方法之一返回一个基本数据类型,就用这个标量同==另一边的标量进行比较。
根据上述,[]要先转换为基本数据类型, []先调用valueOf 方法,结果得到 [],仍是个复合对象,再调用 toString, [].toString() =""。
到此 []==0 变为判断 ""==0 的值,变换到这里,结果就很容易得出了。字符串和数值比较,字符串先转为数值类型,再进行比较。
"" =>0, 0 == 0 ,所以答案出来了,结果为 true 。
现在把上面的转换思路,整合在一起:
欢迎大侠们、大牛们随意拍砖。
推荐阅读:
http://blog.csdn.net/powerglover/article/details/6167696