ECMAScript描述了一组用于操作数据值的操作符,包括算术操作符(如加号和减号)、位操作符、 关系操作符和相等操作符。
ECMAScript 操作符能够适用于很多值,例如字符串、数字值、布尔值,甚至对象。在应用于对象时,相应的操作符通常都会调用对象的valueOf()或toString()方法,以便取得可以操作的值。
一、一元操作符
只能操作一个值的操作符叫做一元操作符
1. 递增和递减操作符
递增和递减操作符直接借鉴自 C,而且各有两个版本:前置型和后置型。前置型应该位于要操作的变量之前,而后置型则应该位于要操作的变量之后。
在使用前置递增操作符给一个数值加 1 时,要把两个加号(++)放在这个数值变量前面:
var age = 29;
++age;
同理,前置递减为:
var age = 29;
--age;
执行前置递增和递减操作时,变量的值都是在语句被求值以前改变的。
var age = 29;
var anotherAge = --age + 2;
alert(age); // 输出28
alert(anotherAge); // 输出30
后置型递增和递减操作符的语法不变(仍然分别是++和--),只不过要放在变量的后面而不是前面。 后置递增和递减与前置递增和递减有一个非常重要的区别,即递增和递减操作是在包含它们的语句被求 值之后才执行的。
var age = 29;
age++;
把递增操作符放在变量后面并不会改变语句的结果,因为递增是这条语句的唯一操作。但是,当语 句中还包含其他操作时,上述区别就会非常明显了。请看下面的例子:
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2; // 等于 22
var num4 = num1 + num2; // 等于 21
在应用于不同的值时,递增和递减操作符遵循下列规则:
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
二、位操作符
位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值。
对于有符号的整数,32 位中的前 31 位用于表示整数的值。第 32 位用于表示数值的符号:0 表示正 数,1 表示负数。这个表示符号的位叫做符号位,符号位的值决定了其他位数值的格式。其中,正数以 纯二进制格式存储,31 位中的每一位都表示 2 的幂。
1. 按位非(NOT)
按位非操作符由一个波浪线(~)表示,执行按位非的结果就是返回数值的反码
var num1 = 25;
var num2 = -num1 - 1;
alert(num2); // "-26"
按位非操作的本质:操作数的负值减 1
2. 按位与(AND)
按位与操作符由一个和号字符(&)表示,它有两个操作符数。从本质上讲,按位与操作就是将两 个数值的每一位对齐,然后根据下表中的规则,对相同位置上的两个数执行 AND 操作:
第一个数值的位 第二个数值的位 结果
1 1 1
1 0 0
0 1 0
0 0 0
按位与操作只在两个数值的对应位都是 1 时才返回 1,任何一位是 0,结果都是 0。
var result = 25 & 3; 6
alert(result); //1
3. 按位或(OR)
按位或操作符由一个竖线符号(|)表示,同样也有两个操作数。按位或操作遵循下面这个真值表。
第一个数值的位 第二个数值的位 结果
1 1 1
1 0 1
0 1 1
0 0 0
按位或操作在有一个位是 1 的情况下就返回 1,而只有在两个位都是 0 的情况下才返回 0。
var result = 25 | 3;
alert(result); //27
4. 按位异或(XOR)
按位异或操作符由一个插入符号(^)表示,也有两个操作数。以下是按位异或的真值表
第一个数值的位 第二个数值的位 结 果
1 1 0
1 0 1
0 1 1
0 0 0
按位异或与按位或的不同之处在于,这个操作在两个数值对应位上只有一个 1 时才返回 1,如果对 应的两位都是 1 或都是 0,则返回 0。
var result = 25 ^ 3;
alert(result); //26
5. 左移
左移操作符由两个小于号()表示,这个操作符会将数值向右移动,但保留符号位(即
正负号标记)。有符号的右移操作与左移操作恰好相反,即如果将64向右移动5位,结果将变回 2:
var oldValue = 64; // 等于二进制的1000000
var newValue = oldValue >> 5; // 等于二进制的10 ,即十进制的2
同样,在移位过程中,原数值中也会出现空位。只不过这次的空位出现在原数值的左侧、符号位的 右侧。而此时 ECMAScript 会用符号位的值来填充所有空位,以便得到一个完整的值。
7. 无符号右移
无符号右移操作符由 3 个大于号(>>>)表示,这个操作符会将数值的所有 32 位都向右移动。对正 数来说,无符号右移的结果与有符号右移相同。仍以前面有符号右移的代码为例,如果将 64 无符号右移5位,结果仍然还是 2:
var oldValue = 64;// 等于二进制的1000000
var newValue = oldValue >>> 5;// 等于二进制的10 ,即十进制的2
但是对负数来说,情况就不一样了。首先,无符号右移是以 0 来填充空位,而不是像有符号右移那 样以符号位的值来填充空位。所以,对正数的无符号右移与有符号右移结果相同,但对负数的结果就不一样了。其次,无符号右移操作符会把负数的二进制码当成正数的二进制码。而且,由于负数以其绝对值的二进制补码形式表示,因此就会导致无符号右移后的结果非常之大。
var oldValue = -64; // 等于二进制的11111111111111111111111111000000
var newValue = oldValue >>> 5; // 等于十进制的 134217726