js中的操作符
1.一元操作符:只能操作一个值的操作符叫做一元操作符。
a. 递增和递减操作符(前置型)
在执行前置的递增递减的操作时,变量的值都是在语句被求值以前改变的。(在计算机科学领域,这种情况被称为副效应。)请看下面的例子:
var age=29;
var other=--age+2;
alert(age); //结果是28
alert(other); //结果是30
由于前置递增和递减操作与执行语句的优先级是相等的,因此整个语句会从左至右被求值。再看一个例子:
var num1=2;
var num2=20;
var num3=--num1+num2;
var num4=num1+num2;
alert(num3); //等于21
alert(num4); //等于21
在这里,num3之所以等于21是因为num1先减去1才与num2相加。而变量num4也等于21是因为相应的加法操作使用了num1减去1之后的值。
b.递增和递减的操作符(后置型)
后置型递增和递减操作符的语法不变,只不过要放在变量的后面而不是前面。后置递增和递减与前置递增和递减有一个非常重要的区别,即递增和递减操作是在包含它们的语句被求值之后才执行的。
举一个例子:
var num1=2;
var num2=20;
var num3=num1--+num2;
var num4=num1+num2;
alert(num3); //等于22
alert(num4); //等于21
在这里计算num3时使用了num1的原始值(2),而num4则使用了递减后的值(1)。
2.一元加和减操作符
a.一元加运算符:一元加操作符以一个加号表示,放在数值前面,对数值不会产生任何影响。例子如下:
var a=25;
a=+a; //仍是25
b.一元减操作符:一元减操作符主要用于表示负数,例如将1变成-1。例子如下:
var a=25;
a=- a; //变成了-25
一元加和减操作符主要是用于基本算数运算,也可以像前面示例所展示的一样用于转换数据类型。
3.位操作符
如正数一样,负数也是以二进制码储存,但使用的格式是二进制补码。计算一个数值的二进制补码,需要经过下列三个步骤:
(1).求这个数值绝对值的二进制码;
(2).求二进制补码,即将0和1互换;
(3).得到的二进制反码加1.
a.按位非(NOT)
按位非操作符由一个波浪线(~)表示,执行按位非的结果就是返回数值的反码。例子:
var num1=25; //二进制00011001
var num2=~num1; //二进制11100110
alert(num2); //-26
b.按位与(AND)
按位与操作符由一个和号字符(&)表示,它有两个操作符数。从本质上讲,按位与操作符就是将两个数值的每一位对齐,然后根据下表的规则,对相同位置上的两个数进行AND操作:
第一个数值的位 | 第二个数值的位 | 结果 |
---|---|---|
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
简而言之,按位与操作符只在两个数值的对应位上都是1的时候返回1,任何一位是0,结果都是0。例子:
var result=25&3;
alert(result); //1
因为25和3的二进制码对应位上只有一位同时是1,而其他位的结果是0,因此最终结果等于1。
c.按位或(OR)
按位或操作符由一个竖线符号(|)表示,同时也有两个操作数。按位或操作遵循下面这个真值表。
第一个数值的位 | 第二个数值的位 | 结果 |
---|---|---|
1 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
由此可见,按位或操作在有一位是1的情况下就返回1,而只有在两个都是0的情况下才返回0.例子:
var result=25 | 3;
alert(result); //27
d.按位异或(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
e.左移
左移操作符由两个小于号(<<)表示,这个操作符会将数值的所有位向左移动指定的位数。例如将2(二进制码为0010)向左移动5位,结果就是64(二进制码01000000),代码如下:
var a = 2;
var b=a<<5; //64
注意,在向左移位后,原数值的右侧多出了5个空位。左移操作会以0来填充这些空位,以便得到的结果是一个完整的二进制数。
注意:左移不会影响操作数的符号位。
f.有符号的右移
有符号的右移操作符由两个大于号(>>)表示,这个操作符会将数值向右移动,但保留符号位(即正负号标记)。有符号的有已操作与左移操作恰好相反,即如果将64向右移动5位,结果将变回2:
var a = 64;
var b =a >>5;
g.无符号右移
无符号右移操作符由3个大于号(>>>)表示,这个操作符会将数值的所有32位都向右移动。对正数来说,无符号右移的结果与有符号右移相同。
但对于负数来说,情况就不一样了。首先,无符号右移是以0来填充空位,而不是像有符号右移那样以符号位的值来填充空位。所以,对正数的无符号右移与有符号右移结果相同,但对负数的结果就不一样了。其次,无符号右移操作会把负数的二进制码当成正数的二进制码。而且由于负数以其绝对值的二进制补码形式表示,因此就会导致无符号右移后的结果非常大。