2.5操作符
ECMA-262描述了一组用于操作数据值的操作符,包括算术操作符(如加号和减号)、位操作符、关系操作符和相等操作符。ECMAScript操作符的与众不同在于,它能够适用于很多值,例如字符串、数字值、布尔值,甚至对象。在应用于对象时,相应的操作符通常都会调用对象的valueOf()和toString()方法,以便取得可以操作的值。
2.5.1一元操作符
只能操作一个值的操作符叫作一元操作符。一元操作符是ECMAScript中最简单的操作符。
2.5.1.1 递增和递减操作符
递增和递减操作符有两个版本:前置型和后置型。前置型位于操作变量之前,而后置位于操作变量之后。因此,在使用前置递增操作符给一个数值加1时,要把两个加号(++)放在这个数值变量前面。执行前置递减操作和前置递增类似。在执行前置递增和递减时,变量的值都是在语句被求值以前改变的。(在计算机科学领域,这种情况通常被称作副效应),例子如下:
var age=29;
++age;
var price=30;
--price;
var antherAge=++age+2
var antherPrice=--price+3;
alert(age); //输出31
alert(antherAge); //输出33
alert(price); //输出28
alert(antherPrice); //输出31
后置型递增和递减操作符的语法不变,只不过要放在变量的后面而不是前面。后置递增和递减与前置递增和递减有一个非常重要的区别,即递增和递减操作是在包含它们的语句被请求之后才执行。例子如下:
var age=29;
age++;
var price=30;
price--;
var antherAge=age++ +2
var antherPrice=price-- +3;
alert(age); //输出31
alert(antherAge); //输出32
alert(price); //输出28
alert(antherPrice); //输出32
所有这4个操作符对任何值都使用,也就是它们不仅仅适用于整数,还可以用于字符串、布尔值、浮点数值和对象。在应用于不同的值时,递增和递减操作符遵循以下规则:
1. 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减1的操作。字符串变量变成数值变量。
2. 在应用于一个不包含有效数字字符的字符串时,将变量的值设置为NaN。字符串变量变成数值变量。
3. 在应用于布尔值false时,先将其转换为0再执行加减1的操作。布尔值变量变成数值变量。
4. 在应用于布尔值true时,先将其转换为1再执行加减1的操作。布尔值变量变成数值变量。
5. 在应用于浮点数值时,执行加减1的操作。
6. 在应用于对象时,先调用对象的valueOf()方法以取得一个可供操作的值。然后对该值应用前述规则。如果结果是NaN,则调用toString()方法后再应用前述规则。对象变量变成数值变量。
以下示例展示了上面的一些规则:
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
2.5.1.2 一元加和减操作符
一元加操作符以一个加号(+)表示,放在数值前面,对数值不会产生任何影响。不过,在对非数值应用一元加操作符时,该操作符会像Number()转型函数一样对这个值执行转换。换句话说,布尔值false和true将被换为0和1,字符串值会被按照一组特殊的规则进行解析,而对象是先调用它们的valueOf()和toString()方法,再转换得到的值。
以下展示对不同数据类型应用一元加操作符的结果:
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
在将一元减操作符应用于数值时,该值会变成负数。而当应用于非数值时,一元减操作符遵循与一元加操作符相同的规则,最后再将得到的数值转换为负数,如下面所示:
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