第三章 JavaScript运算符

ECMAScript 语法
ECMAScript 变量
ECMAScript 关键字
ECMAScript 保留字
ECMAScript 值
ECMAScript 原始类型
ECMAScript 类型转换
ECMAScript 引用类型

目标
一元运算符
位运算符
逻辑运算符
乘性运算符
加性运算符
关系运算符
等性运算符
条件运算符
赋值运算符

[img]http://dl.iteye.com/upload/attachment/244017/0492813a-d8a6-345e-a803-572e00753292.jpg[/img]

[size=large]运算符[/size]
因为ECMAScript的运算符规则和JAVA有很多相似的地方,相同的我们就不过多的进行解析,我们研究一下ECMAScript几个特有的运算符,以及ECMAScript运算符的特殊地方。

注意:在构造ECMAScript的表达式时,一定要注意传递给运算符的数据类型和返回的数据类型,各种运算符用来计算的运算数表达式要符合某种数据类型,例如,对字符串不能进行乘法运算,所以在ECMAScript中表达式“a”*“b”是不合法的,但是要注意,在可能的情况下, ECMAScript会把表达式转换为适当的类型,因此表达式“3”*“5”是合法的,它的值是数字15,而不是字符串“15”。但是“3”+“5”的结果是35,它会执行字符串连接的操作。

[size=large]一元加法和一元减法[/size]

一元加法本质上对数字无任何影响:
var iNum = 20;
iNum = +iNum;
alert(iNum); //输出 "20"

尽管一元加法对数字无作用,但对字符串却有有趣的效果,会把字符串转换成数字。
var sNum = "20";
alert(typeof sNum); //输出 "string"
var iNum = +sNum;
alert(typeof iNum); //输出 "number"

这段代码把字符串 “20” 转换成真正的数字。当一元加法运算符对字符串进行操作时,它计算字符串的方式与 parseInt() 相似 ,为了不产生二议性,请不要使用这种方式转换字符串,请使用parseInt() 方法来转换。一元减法就是对数值求负 ,与一元加法运算符相似,一元减法运算符也会把字符串转换成近似的数字,此外还会对该值求负。

[size=large]关系运算符 [/size]

每个关系运算符都返回一个布尔值:
var bResult1 = 2 > 1 //true
var bResult2 = 2 < 1 //false
不过,对两个字符串应用关系运算符,它们的行为则不同。许多人认为小于表示“在字母顺序上靠前”,大于表示“在字母顺序上靠后”,但事实并非如此。对于字符串,第一个字符串中每个字符的代码都与会第二个字符串中对应位置的字符的代码进行数值比较。完成这种比较操作后,返回一个 Boolean 值。问题在于大写字母的代码都小于小写字母的代码,这意味这着可能会遇到下列情况:
var bResult = "Blue" < "alpha";
alert(bResult); //输出 true
要强制性得到按照真正的字母顺序比较的结果,必须把两个数转换成相同的大小写形式(全大写或全小写的),然后再进行比较:
var bResult = "Blue".toLowerCase() < "alpha".toLowerCase();
alert(bResult); //输出 false

[size=large]比较数字和字符串 [/size]

另一种棘手的状况发生在比较两个字符串形式的数字时,比如:
var bResult = "25" < "3";
alert(bResult); //输出 "true“
上面这段代码比较的是字符串 "25" 和 "3"。两个运算数都是字符串,所以比较的是它们的字符代码("2" 的字符代码是 50,"3" 的字符代码是 51)。
不过,如果把某个运算数该为数字,那么结果就有趣了:
var bResult = “25” < 3; alert(bResult); //输出 “false”
不过,如果字符串不能转换成数字又该如何呢?考虑下面的例子:
var bResult = "a" < 3; alert(bResult); 你能预料到这段代码输出什么吗?字母 "a" 不能转换成有意义的数字。不过,如果对它调用 parseInt() 方法,返回的是 NaN。根据规则,任何包含 NaN 的关系运算符都要返回 false,因此这段代码也输出 false:

[size=large]等号和非等号[/size]

在 ECMAScript 中,等号由双等号(==)表示,当且仅当两个运算数相等时,它返回 true。非等号由感叹号加等号(!=)表示,当且仅当两个运算数不相等时,它返回 true。为确定两个运算数是否相等,这两个运算符都会进行类型转换。

执行类型转换的规则如下:
如果一个运算数是 Boolean 值,在检查相等性之前,把它转换成数字值。false 转换成 0,true 为 1。
如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字。
如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。
如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字

在比较时,该运算符还遵守下列规则:
值 null 和 undefined 相等。
在检查相等性时,不能把 null 和 undefined 转换成其他值。
如果某个运算数是 NaN,等号将返回 false,非等号将返回 true。
如果两个运算数都是对象,那么比较的是它们的引用值。如果两个运算数指向同一对象,那么等号返回 true,否则两个运算数不等。
重要提示:即使两个数都是 NaN,等号仍然返回 false,因为根据规则,NaN 不等于 NaN。
下表列出了一些特殊情况,以及它们的结果:

[img]http://dl.iteye.com/upload/attachment/244015/054166a5-40b1-366c-a81b-b795824d0ee0.jpg[/img]

[size=large]全等号和非全等号[/size]

等号和非等号的同类运算符是全等号和非全等号。这两个运算符所做的与等号和非等号相同,只是它们在检查相等性前,不执行类型转换。
全等号由三个等号表示(===),只有在无需类型转换运算数就相等的情况下,才返回 true。
例如:
var sNum = "66";
var iNum = 66;
alert(sNum == iNum); //输出 "true"
alert(sNum === iNum); //输出 "false"
在这段代码中,第一个 alert 使用等号来比较字符串 "66" 和数字 66,输出 "true"。如前所述,这是因为字符串 "66" 将被转换成数字 66,然后才与另一个数字 66 进行比较。第二个 alert 使用全等号在没有类型转换的情况下比较字符串和数字,当然,字符串不等于数字,所以输出 "false"。
非全等号由感叹号加两个等号(!==)表示,只有在无需类型转换运算数不相等的情况下,才返回 true。
例如:
var sNum = "66";
var iNum = 66;
alert(sNum != iNum); //输出 "false"
alert(sNum !== iNum); //输出 "true"
这里,第一个 alert 使用非等号,把字符串 "66" 转换成数字 66,使得它与第二个运算数 66 相等。因此,计算结果为 "false",因为两个运算数是相等的。第二个 alert 使用的非全等号。该运算是在问:"sNum" 与 "iNum" 不同吗?这个问题的答案是:是的(true),因为 sNum 是字符串,而 iNum 是数字,它们当然不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值