JavaScript教程:实例解析运算符

2016-02-20 01:06 11 1 收藏

清醒时做事,糊涂时读书,大怒时睡觉,无聊时关注图老师为大家准备的精彩内容。下面为大家推荐JavaScript教程:实例解析运算符,无聊中的都看过来。

【 tulaoshi.com - Web开发 】

在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在 答案 中的解释是:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

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

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

运行代码框

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

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

运行代码框

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

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

看看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.tulaoshi.com/n/20160220/1633268.html

延伸阅读
标签: Web开发
||是这样运算的:从第一个开始,遇到有意义的返回,否则返回最后一个表达式(注意不一定是Boolean值);  &&是这样运算的:从第一个开始,遇到无意义的返回,否则返回最后一个表达式(注意同上);  !是这样运算的:对表达式的值取非(注意不是对表达式)。  什么是无意义呢:如下六个 0,null,undefined,"",false,NaN...
标签: Web开发
表达式和运算符 1、表达式 在定义完变量后,就可以对它们进行赋值、改变、计算等一系列操作,这一过程通常又叫称一个叫表达式来完成,可以说它是变量、常量、布尔及运算符的集合,因此表达式可以分为算术表述式、字串表达式、赋值表达式以及布尔表达式等。 2、运算符 运算符完成操作的一系列符号,在JavaScript中有算术运...
为什么需要转换运算符? 大家知道对于内置类型的数据我们可以通过强制转换符的使用来转换数据,例如(int)2.1f;自定义类也是类型,那么自定义类的对象在很多情况下也需要支持此操作,C++提供了转换运算符重载函数,它使得自定义类对象的强转换成为可能。 转换运算符的生命方式比较非凡,方法如下: operator 类名(); ...
标签: Web开发
JavaScript中按位右移运算符()是右移表达式的位,保持符号不变。使用方法: result = expression1 expression2 其中result是任何变量。 expression1是任何表达式。 expression2是任何表达式。 说明 运算符把 expression1 的所有位向右移 expression2 指定的位数。expression1 的符号位被用来填充右移后左边空出来的位。向右移出的位被丢弃...
标签: Web开发
无符号右移运算符 ()是右移表达式的位,不保留符号。使用示例 result = expression1 expression2 其中result是任何变量。 expression1是任何表达式。 expression2是任何表达式。 JavaScript中无符号右移运算符说明 运算符把 expression1 的各个位向右移 expression2 指定的位数。右移后左边空出的位用零来填充。移出右边的位被丢弃。例如...

经验教程

945

收藏

23
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部