操作符
一元操作符
递增递减操作
后置
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2;//等于22
var num4 = num1 + num2;//等于21
前置
var num1 = 2;
var num2 = 20;
var num3 = --num + num2;//等于21
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
一元加减操作符
一元加操作符以一个加号(+)表示,放在数值前面,对数值不会产生任何影响,不过在对非数值应用一元加操作符时,该操作符会像Number()转型函数一样对这个值执行转换。
一元减操作符应用于数值时,该值会变负数,而当应用于非数值时,与一元加操作符一样,最后将得到的数值转换为负数。
主要用于基本的算术运算,也可以用于转换数据类型。
位操作符
位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值。实际上数值是按照64位格式存储,但是位操作符并不是直接操作64位的值,而是先将64位的值转为32位的整数,然后执行操作,最后再将结果转回64位。
有符号的整数,32位中的前31位用于表示整数的值,第32位(符号位)表示数值的符号:0表示正数,1表示负数。
负数的二进制存储过程
- 求这个数值绝对值的二进制码(例如要求-18的二进制补码,先求18的二进制码);
- 求二进制反码,即将0替换为1,1替换为0;
- 得到二进制反码加1。
var num = -18;
alert(num.toString(2));//"-10010"
按位非(NOT)
按位非操作符由一个波浪线(~)表示,返回数值的反码。
var num1 = 25; //二进制:00000000000000000000000000011001
var num2 = ~num1;//二进制:11111111111111111111111111100110
alert(num2);//"-26"
var num3 = -num1 - 1;
alert(num3);//"-26"
对25执行按位非操作,结果为-26,验证了其本质:操作数的负值减1。
虽然num2和num3都得到了-26,但是按位非是在数值表示的最底层执行操作,因此速度更快。
按位与(AND)
按位与操作符由一个和号字符(&)表示,有两个操作符数。
按位或(OR)
由一个竖线符号(|)表示,有两个操作数。
按位异或(XOR)
由一个插入符号(^)表示,有两个操作数。
左移
由两个小于号(<<)表示,这个操作符会将数值的所有位向左移动指定的位数。
var oldValue = 2;//二进制位10
var newValue = oldValue << 5;//等于二进制的1000000,十进制位64
注意,向左移位后,原数值右侧多出了5个空位,左移操作会以0来填充这些空位,以便得到的结果是一个完整的32位二进制数。
左移不会影响操作数的符号位,如将-2向左移动5位,结果将是-64,而不是64.
有符号的右移
由两个大于号(>>)表示,会将数值向右移动,但是保留符号位。其操作与左移操作恰好相反。
var oldValue = 64;//二进制位1000000
var newValue = oldValue >> 5;//等于二进制的10,十进制位2
对原数值中出现的空位,将以符号位的值来填充,空位出现在原数值的左侧符号位的右侧。
无符号右移
由3个大于号(>>>)表示,将数值的所有32位都向右移动。对于正数来说无符号右移和有符号右移的结果相同,但是对于负数来说将有很大不同。
- 无符号右移都是以0来填充空位;
- 无符号右移会把负数的二进制码当成正数的二进制码。
var oldValue = -64;//二进制:11111111111111111111111111000000
var newValue = oldValue >>> 5;
//二进制:00000111111111111111111111111110 十进制134217726
布尔操作
逻辑非(!)
无论值为什么类型,这个操作符都回返回一个布尔值。
如果操作数是一个对象,返回false。
alert(!false);//true
alert(!"blue");//false
alert(!0);//true
alert(!NaN);//true
alert(!"");//true
alert(!12345);//false
逻辑与(&&)
var result = true && false;
注意:
- 若第一个操作数是对象,返回第二个操作数;
- 若第二个操作数是对象,则只有在第一个操作数的值为true时才会返回该对象;
- 若两个操作数都是对象,返回第二个操作数;
- 若有一个操作数是null,则返回null;
- 若有一个操作数是undefined,则返回undefined。
逻辑与是短路操作符,如果第一个操作符为false,则不会对第二个操作符进行求值。
逻辑或(||)
注意:
- 若第一个操作数是对象,则返回第一个操作数;
- 若第一个操作数的求职结果为false,则返回第二个操作数;
- 若两个操作数都是对象,则返回第一个操作数;
- 若两个操作数都是null,则返回null;
- 若两个操作数都是NaN,则返回NaN;
- 若两个操作数都是undefined,则返回undefined。
逻辑或也是短路操作符,如果第一个操作符为true,则不会对第二个操作符进行求值。
乘性操作符(乘法(*)、除法(/)、求模(%))
加性操作符(加法(+)、减法(-))
关系操作符(小于(<)、大于(>)、小于等于(<=)、大于等于(>=))
相等操作符(相等(==)、不相等(!=)、全等(===)、不全等(!==))
条件操作符
var max = (num1 > num2) ? num1 : num2;
赋值操作符(=)
逗号操作符(,)
var num = (1,2,3,4,5);//num的值为5,返回表达式的最后一项