3.5 操作符
ECMA-262 描述了一组用于操作数据值的操作符,包括算术操作符(如加号和减号)、位操作符、关系操作符和相等操作符。
ECMAScript 操作符的与众不同之处在于,它们能够适用于很多值,例如字符串、数字值、布尔值,甚至对象。
不过,在应用于对象时,相应的操作符通常都会调用对象的valueOf()和(或)toString()方法,以便取得可以操作的值。
3.5.1 一元操作符
只能操作一个值的操作符叫做一元操作符。一元操作符是ECMAScript 中最简单的操作符。
1. 递增和递减操作符
前置型和后置型。顾名思义,前置型应该位于要操作的变量之前,而后置型则应该位于要操作的变量之后。
因此,在使用前置递增操作符给一个数值加1 时,要把两个加号(++)放在这个数值变量前面,如下所示:
var age = 29;
++age;
在这个例子中,前置递增操作符把age 的值变成了30(为29 加上了1)。
实际上,执行这个前置递增操作与执行以下操作的效果相同:
var age = 29;
age = age + 1;
执行前置递减操作的方法也类似,结果会从一个数值中减去1。使用前置递减操作符时,
要把两个减号(--)放在相应变量的前面,如下所示:
var age = 29;
--age;
这样,age 变量的值就减少为28(从29 中减去了1)。
执行前置递增和递减操作时,变量的值都是在语句被求值以前改变的。(在计算机科学领域,这种情况通常被称作副效应。)请看
下面这个例子。
<!DOCTYPE html>
<html>
<head>
<title>Increment/Decrement Example 1</title>
<script type="text/javascript">
var age = 29;
var anotherAge = --age + 2;
alert(age); //输出28
alert(anotherAge); //输出30
</script>
</head>
<body>
</body>
</html>
这个例子中变量anotherAge 的初始值等于变量age 的值前置递减之后加2。由于先执行了减法操作,age 的值变成了28,
所以再加上2 的结果就是30。由于前置递增和递减操作与执行语句的优先级相等,因此整个语句会从左至右被求值。
再看一个例子:
<!DOCTYPE html>
<html>
<head>
<title>Increment/Decrement Example 2</title>
<script type="text/javascript">
var num1 = 2;
var num2 = 20;
var num3 = --num1 + num2; //等于21
var num4 = num1 + num2; //等于21
alert(num3);
alert(num4);
</script>
</head>
<body>
</body>
</html>
在这里,num3 之所以等于21 是因为num1 先减去了1 才与num2 相加。
而变量num4 也等于21 是因为相应的加法操作使用了num1 减去1 之后的值。
----------------------------------------------------------------------------------------------------------------------------------------
后置型递增和递减操作符的语法不变(仍然分别是++和--),只不过要放在变量的后面而不是前面。
后置递增和递减与前置递增和递减有一个非常重要的区别,
即递增和递减操作是在包含它们的语句被求值之后才执行的。这个区别在某些情况下不是什么问题,例如:
var age = 29;
age++;
把递增操作符放在变量后面并不会改变语句的结果,因为递增是这条语句的唯一操作。但是,当语
句中还包含其他操作时,上述区别就会非常明显了。请看下面的例子:
<!DOCTYPE html>
<html>
<head>
<title>Increment/Decrement Example 3</title>
<script type="text/javascript">
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2; //equals 22
var num4 = num1 + num2; //equals 21
alert(num3);
alert(num4);
</script>
</head>
<body>
</body>
</html>
这里仅仅将前置递减改成了后置递减,就立即可以看到差别。在前面使用前置递减的例子中,num3和num4 最后都等于21。
而在这个例子中,num3 等于22,num4 等于21。差别的根源在于,这里在计算num3 时使用了num1 的原始值(2)完成了加法计
算,而num4 则使用了递减后的值(1)
----------------------------------------------------------------------------------------------------------------------------------------------
所有这4 个操作符对任何值都适用,也就是它们不仅适用于整数,还可以用于字符串、布尔值、浮点数值和对象。
在应用于不同的值时,递增和递减操作符遵循下列规则。
- 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减1 的操作。字符串变量变成数值变量。
- 在应用于一个不包含有效数字字符的字符串时,将变量的值设置为NaN。字符串变量变成数值变量。
- 在应用于布尔值false 时,先将其转换为0 再执行加减1 的操作。布尔值变量变成数值变量。
- 在应用于布尔值true 时,先将其转换为1 再执行加减1 的操作。布尔值变量变成数值变量。
- 在应用于浮点数值时,执行加减1 的操作。
- 在应用于对象时,先调用对象的valueOf()方法以取得一个可供操作的值。然后对该值应用前述规则。如果结果是NaN,则在调用toString()方法后再应用前述规则。对象变量变成数值变量。
以下示例展示了上面的一些规则:
<!DOCTYPE html>
<html>
<head>
<title>Increment/Decrement Example 4</title>
<script type="text/javascript">
var s1 = "2";
var s2 = "z";
var b = false;
var f = 1.1;
var o = {
valueOf: function() {
return -1;
}
};
s1++; // 值变成数值3
s2++; // 值变成NaN
b++; // 值变成数值1
f--; // 值变成0.10000000000000009(由于浮点舍入错误所致)
o--; // 值变成数值-2
alert(s1);
alert(s2);
alert(b);
alert(f);
alert(o);
</script>
</head>
<body>
</body>
</html>
2. 一元加和减操作符
绝大多数开发人员对一元加和减操作符都不会陌生,而且这两个ECMAScript 操作符的作用与数学书上讲的完全一样。一元加操作符以一个加号(+)表示,放在数值前面,对数值不会产生任何影响,
如下面的例子所示:
var num = 25;num = +num; // 仍然是25
不过,在对非数值应用一元加操作符时,该操作符会像Number()转型函数一样对这个值执行转换。
换句话说,布尔值false 和true 将被转换为0 和1,字符串值会被按照一组特殊的规则进行解析,而
对象是先调用它们的valueOf()和(或)toString()方法,再转换得到的值。
下面的例子展示了对不同数据类型应用一元加操作符的结果:
<!DOCTYPE html>
<html>
<head>
<title>Unary Plus/Minus Example 1</title>
<script type="text/javascript">
var s1 = "01";
var s2 = "1.1";
var s3 = "z";
var b = false;
var f = 1.1;
var o = {
valueOf: function() {
return -1;
}
};
s1 = +s1; // 值变成数值1
s2 = +s2; // 值变成数值1.1
s3 = +s3; // 值变成NaN
b = +b; // 值变成数值0
f = +f; // 值未变,仍然是1.1
o = +o; // 值变成数值-1
alert(s1);
alert(s2);
alert(s3);
alert(b);
alert(f);
alert(o);
</script>
</head>
<body>
</body>
</html>
一元减操作符主要用于表示负数,例如将1 转换成-1。下面的例子演示了这个简单的转换过程:var num = 25;
num = -num; // 变成了-25
在将一元减操作符应用于数值时,该值会变成负数(如上面的例子所示)。而当应用于非数值时,
一元减操作符遵循与一元加操作符相同的规则,最后再将得到的数值转换为负数,如下面的例子所示:
<!DOCTYPE html>
<html>
<head>
<title>Unary Plus/Minus Example 2</title>
<script type="text/javascript">
var s1 = "01";
var s2 = "1.1";
var s3 = "z";
var b = false;
var f = 1.1;
var o = {
valueOf: function() {
return -1;
}
};
s1 = -s1; // 值变成了数值-1
s2 = -s2; // 值变成了数值-1.1
s3 = -s3; // 值变成了NaN
b = -b; // 值变成了数值0
f = -f; // 变成了-1.1
o = -o; // 值变成了数值1
alert(s1);
alert(s2);
alert(s3);
alert(b);
alert(f);
alert(o);
</script>
</head>
<body>
</body>
</html>
3.5.2 位操作符
位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值。
记不住,用到再学
3.5.3 布尔操作符
3.5.4 乘性操作符
3.5.5 加性操作符
3.5.6 关系操作符
3.5.7 相等操作符
3.5.8 条件操作符
3.5.9 赋值操作符
3.5.10 逗号操作符