- 一元操作符
ECMAScript中最简单的操作符就是一元操作符,它只可以操作一个值。
递增与递减操作符
递增与递减操作符分为前置型与后置型。
执行前置递增和递减操作时,变量的值是在语句被求值以前变的。
如下例:
var num1=2;
var num2=20;
var num3=--num1+num2; //21
var num4=num1+num2; //21
后置递增和递减操作是在包含他们的语句被求值以后才执行的。
如下例:
var num1=2;
var num2=20;
var num3=num1--+num2; //22
var num4=num1+num2; //21
适用于整数、字符串、布尔值、浮点数值、对象。在应用于不同的值时,遵循下列规则。
如果是一个包含数字字符的字符串时,先将其转换为数值,在执行加减1的操作。然后将字符串变量转换为数值变量。
如果是一个不包含数字字符的字符串,首先将变量的值设置为NaN,然后将字符串变量变为数值变量。
如果是布尔值false时,先将其转换为数字0,在执行加减的操作,将布尔值变量变为数值变量。
如果是浮点数值时,执行加减1的操作。
如果是对象,先调用对象的valueOf()方法以取得一个可供操作的值。然后对该值应用前述规则,若结果为NaN,则在调用toString()方法后再应用前述规则。对象变量变为数值变量。
一元加和减操作符
一元加操作符以一个加号(+)表示,放在数值前面,对数值不会产生任何影响。
一元加操作符应用于布尔值时,false与true被转换为0和1。
一元加操作符用于字符串值会按照一组特殊的规则进行解析。
一元操作符应用于对象首先会调用它们的valueOf()和toString()方法,在转换得到的值。
一元减操作符应用于数值时,该值会变成负数。应用于非数值时,与一元加操作符规则相同,最后将得到的数值转换为负数。
- 位操作符
位操作符用于最基本的层次上,即按照内存中表示数值的位来操作数值。
ECMAScript中的所有数值都以IEEE-754 64位格式存储,但操作符并不直接操作64位值,而是先将64位的值转换为32位的整数,然后执行操作,最后将结果转换位64位。
有符号的整数,第32位叫做符号位,0表正,1表负,前31位用于表示整数值。
正数以二进制格式存储,31位中的每一位都表示2的幂,第一位(位0)表示2的0次方,第二位表示2的1次方,以此类推。
负数以二进制码存储,使用格式位二进制补码。
计算二进制补码的步骤1:求绝对值的二进制码。2:求二进制反码,就是0替换为1,1替换为0。 3:将得到的二进制反码加1。
无符号整数第32位不表示符号,只可以是正整数。
对NaN与Infinity值应用位不表示符号,会被当成0处理。
对于非数值应用位操作符,会先使用Number()函数将该值转换为一个数值,然后应用位操作符,作为一个数值。
按位非(NOT)
由一个波浪线(~)表示,执行按位非的结果就是返回数值的反码,按位非的本质:操作数的负值减1。
按位与(AND)
按位与操作符由一个和号字符(&)表示,有两个操作符数。
按位与的本质:将两个数值的每一位对齐,两个都为真则为真,其余情况为假。
按位或(OR)
由一个竖线符号(|)表示,有两个操作数,遇到真为真,两个都是假才为假。
按位异或(XOR)
由一个插入符号(^) 表示,有两个操作数。
规则是两个操作数不同时为真,相同时为假。
左移
由两个小于号(<<)表示,将数值所有位向左移动的位数。
不影响操作数的符号位。
右移
有符号的右移操作符由两个大于号( >>)表示,将数值向右移动,但保留符号位(即正负号标记)。
无符号右移操作符由三个大于号(>>>)表示,会将数值的所有32位都向右移动,正数同有符号右移一样。对于负数来说,会把二进制码当成正数的二进制码,会导致结果非常之大。