大连仟亿科技
客服中心
  • 电话
  • 电话咨询:0411-39943997
  • 手机
  • 手机咨询:15840979770
    手机咨询:13889672791
网络营销 >更多
您现在的位置:仟亿科技 > 新闻中心 > 常见问题

网站js笔试题到==运算符的简析

作者:billionnet 发布于:2012/3/23 18:15:32 点击量:

在cssrain整理的一个 试题集 中有这么一道题:



运行代码框

[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]


按照我的理解,任何非0的数值的布尔值都应该为true。


可是这道题的正确输出为:false false true。


(-1==true)的值为false。


再来看下面这个例子:



运行代码框

[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]


运行结果依次为:false,true,true。


在这里,我们发现,if(aVar) 和 if(aVar == true)的结果并不相同。


cssrain在 答案 中的解释是:


if(aVar) 和  if (aVar==true) 对负数有截然不同的答案。


真的是负数的原因吗?看下面这个例子:


运行代码框

[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]


为什么正数2返回的也是false呢。我们将数字转换为boolean值看看。


运行代码框

[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]


这里非0数值的布尔值的确都是true,也就是说所有的问题都集中在2==true中的==运算符上。基本可以确定,==一定不是把数字转换为布尔值再进行比较。


看看ECMA-262(第80页)中怎么说的:


6.If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.
7.If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).


也就是说,布尔值会被首先转换为数字,然后进行比较。true的数字值为1,false为0。所以2和-1都不能和true相等。


进一步看下面这个例子:



运行代码框

[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]


按照前面的思路,true会被转换为1,所以三个语句都会返回false。运行一下,发现的确如此。


下面将if(aVar==true)改为if(aVar)。


运行代码框

[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]


这时的运行结果是true,true,false。因为Boolean("undefined")、Boolean("false")、Boolean("")的结果为true,true,false。非空字符串转换为布尔值true。


后面还有一个例子,解释当==两边为字符串和数字时的比较规律。


运行代码框

[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]


发现没,这个"001"==true是为true的。


因为true先被转换为1了。然后参考ECMA的规则:


4.If Type(x) is Number and Type(y) is String, return the result of the comparison x == ToNumber(y).
5.If Type(x) is String and Type(y) is Number, return the result of the comparison ToNumber(x) == y.


字符串要被转换为数字,Number("001")的值也为1,所以结果为true。



分享到:


评论加载中...
内容:
评论者: 验证码:
  

Copyright@ 2011-2017 版权所有:大连仟亿科技有限公司 辽ICP备11013762-1号   google网站地图   百度网站地图   网站地图

公司地址:大连市沙河口区中山路692号辰熙星海国际2215 客服电话:0411-39943997 QQ:2088827823 42286563

法律声明:未经许可,任何模仿本站模板、转载本站内容等行为者,本站保留追究其法律责任的权利! 隐私权政策声明