码迷,mamicode.com
首页 > 其他好文 > 详细

[] == ![] 结果是什么?

时间:2014-05-18 19:37:11      阅读:440      评论:0      收藏:0      [点我收藏+]

标签:des   cWeb   style   blog   code   c   

这道题说难也不难。主要考察隐式转换的一些知识。一些可能我们知道,但不常用。或者说是记忆中的模糊地带。下面青菜就带大家看看,这道题里有哪些坑:

第一坑:运算符优先级

拿到这道题,首先你要知道,运算是从左到右,还是从右到左。

bubuko.com,布布扣

参照上图(优先级从高到底),我们得到! 优先级高于==。所以[]==![]的运算顺序是从右向左。到此第一个坑,跨过去了。

第二坑:Boolean 隐式转换规则

!(逻辑非),在javascript高级程序设计(第三版)是这样定义的

bubuko.com,布布扣

也就是说会先把[]转换为布尔值,再进去取反。这里就要设计到Boolean的转换规则:

false、""、0、NaN、null、undefined五种情况会被转换为false,其余任何值都会被转换为true。

[]不在五种情况之列,也就直接转为true了。再对其取反,可以得出[]==![]的右边为false.则现在的问题转化为判断[]==false的值。

第三坑:==遵循的原则

javascript高级程序设计(第三版)是这样

bubuko.com,布布扣

bubuko.com,布布扣

一句话理解

==比较先把两侧的值转化为基本数据类型,也就是Number/String/布尔。如果两个基本数据类型不同,然后将基本数据类型转化为数字进行比,较如果相同直接比较值。

回到我们的题目,跨过第二坑我们已经得到[]==false,根据上面所说的原则,当有一个操作数是布尔值时,先把该操作数转为数值,因此[]==false => []==0.

现在是空数组[]和0进行比较,那这里有什么知识点呢?请往下看

JS中简单类型与引用类型进行==比较的情况 
这种比较也是有规则的,并且可以用代码来验证JS内部的执行情况。
将一个简单类型(这里指除undefined与null的值)与一个对象比较时, 
先调用对象的 valueOf 方法,以期待返回一个基本数据类型的值,如果对象的 valueOf 方法返回的仍然是一个复合对象,
就接着调用对象的 toString 方法以期待返回一个基本数据类型的,如果仍然没有返回基本数据类型的值,就判为不相等,
如果valueOf 或 toString 方法之一返回一个基本数据类型,就用这个标量同==另一边的标量进行比较。

根据上述,[]要先转换为基本数据类型, []先调用valueOf 方法,结果得到 [],仍是个复合对象,再调用 toString, [].toString() =""。

到此 []==0 变为判断 ""==0 的值,变换到这里,结果就很容易得出了。字符串和数值比较,字符串先转为数值类型,再进行比较。

"" =>0, 0 == 0 ,所以答案出来了,结果为 true 。

现在把上面的转换思路,整合在一起:

bubuko.com,布布扣

 

欢迎大侠们、大牛们随意拍砖。

推荐阅读:

http://blog.csdn.net/powerglover/article/details/6167696

 

 

 

[] == ![] 结果是什么?,布布扣,bubuko.com

[] == ![] 结果是什么?

标签:des   cWeb   style   blog   code   c   

原文地址:http://www.cnblogs.com/greens-front/p/3731843.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!