==运算符
来源:互联网 发布:知乎钓鱼贴 编辑:程序博客网 时间:2024/06/10 18:16
在cssrain整理的一个 试题集 中有这么一道题:
<SCRIPT LANGUAGE="JavaScript">
var a = 0;
var b = -1;
var c = 1;
function assert (aVar) {
if (aVar==true) alert(true);
else alert(false);
}
assert(a) ;
assert(b) ;
assert(c) ;
</SCRIPT>
运行代码框
[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]
按照我的理解,任何非0的数值的布尔值都应该为true。
可是这道题的正确输出为:false false true。
(-1==true)的值为false。
再来看下面这个例子:
<SCRIPT LANGUAGE="JavaScript">
var a = 0;
var b = -1;
var c = 1;
function assert (aVar) {
if (aVar) alert(true);
else alert(false);
}
assert(a) ;
assert(b) ;
assert(c) ;
</SCRIPT>
运行代码框
[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相等。
进一步看下面这个例子:
<SCRIPT LANGUAGE="JavaScript">
var a = "undefined";
var b = "false";
var c = "";
function assert (aVar) {
if (aVar==true) alert(true);
else alert(false);
}
assert(a);
assert(b);
assert(c);
</SCRIPT>
运行代码框
[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。
摘自http://www.blueidea.com/tech/web/2010/7576.asp
- java运算符(++运算和+=运算)
- / 运算符 と /= 运算符
- == 运算符
- ==运算符
- 飞船运算符 <=>
- |=运算符
- 位运算符|=
- 重载=运算符
- +=运算符重载
- 重载“=”运算符
- 重载运算符=
- +=运算
- 十九、运算符重载(三)String类的改进实现、[]运算符重载、+运算符重载、+=运算符重载、<<运算符重载、>>运算符重载
- ===运算符
- 赋值运算符“=”与等号运算符“==”
- == 运算符重载
- struct的=运算符 赋值运算符
- Linq中=>运算符
- hdu 2544 最短路(最短路第一弹)
- WebService
- 测试工程师如何提升自己
- 浅谈ASP脚本的解释
- 排序(sorting)
- ==运算符
- 软件架构设计之四:面向对象方法
- linux安装中文
- NYOJ 49-开心的小明:01背包
- -mfloat-abi=softfp的问题,指定fpu为neon
- [转]64位win7系统安装vs2010不成功的解决办法
- 声明与函数、函数指针
- UNIX网络编程——网络IPC:套接字
- Doing Homework again