JavaScript操作符
操作符
算数操作符、位操作符、关系操作符、相等操作符
一元操作符
一元操作符就是能操作一个值的操作符。
自增自减操作符
前置型:++a,–a
后置型:a++,a–
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2;//22
var num4 = num1 + num2;//21
//区别于下面
var num1 = 2;
var num2 = 20;
var num3 = --num1 + num2;//21
var num4 = num1 + num2;//21
num–:在运算中,先取num值,再做运算
++num:在运算时,先让num的值+1,再做运算
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
一元加和减操作符
var num = 25;
num = +num;//num的值还是25
num = -num;//num的值变成了-25
var s1 = "4";
s1 = +s1;//s1从字符串变成了数值4
+、- 可以使其他任意类型数值变为Number类型。
位操作符
按位非(~)
var num1 = 25;
var num2 = ~num1;
alert(num2);//-26
本质:操作数的负值-1
按位与(&)
在两个数值对应位都是1时才为1
var num1 = 25 & 3;
alert(num1);//1
原因:将25和3变为二进制后进行按位与操作
25 = 0000 0000 0000 0000 0000 0000 0001 1001
03 = 0000 0000 0000 0000 0000 0000 0000 0011
----------------------------------------------
0000 0000 0000 0000 0000 0000 0000 0001
只有1位同时为1
按位或(|)
两个数值对应位都为0时返回0
var num1 = 25 | 3;
alert(num1);//27
25 = 0000 0000 0000 0000 0000 0000 0001 1001
03 = 0000 0000 0000 0000 0000 0000 0000 0011
----------------------------------------------
0000 0000 0000 0000 0000 0000 0001 1011
按位异或(^)
两个数值对应位上的数值不同时返回1
var num1 = 25 ^ 3;
alert(num1);//26
25 = 0000 0000 0000 0000 0000 0000 0001 1001
03 = 0000 0000 0000 0000 0000 0000 0000 0011
----------------------------------------------
0000 0000 0000 0000 0000 0000 0001 1010
左移(<<)
var num1 = 2;//二进制的10
var num2 = num1<<5;//二进制的1000000,十进制的64
var num3 = -2;//二进制的-10
var num4 = num1<<5;//二进制的-1000000,十进制的-64
有符号的右移(>>)
数值向右移动,但保留符号位
var num1 = 64;//二进制的1000000
var num2 = num1>>5;//二进制的10,十进制的2
无符号的右移(>>>)
对于正数来说,无符号的右移与有符号的右移结果相同
对于负数来说:
不保留符号位
var oldValue = -64;
var newValue = oldValue >>> 5;
---------------------------------------------------
-64 = 1111 1111 1111 1111 1111 1111 1100 0000
new = 0000 0111 1111 1111 1111 1111 1111 1110
布尔操作符
逻辑非(!)
alert(!false);//true
alert(!"blue");//false
alert(!0);//true
alert(!NaN);//true
alert(!"");//true
alert(!12345);//false
逻辑与(&&)
两个操作数都是真时,返回真
在有一个操作数不是布尔值的情况下,逻辑与操作不一定返回布尔值。
- 若第一个操作数是对象,则返回第二个操作数
- 若第二个操作数是对象,则只在第一个操作数的求值结果为true的情况下才会返回该对象。
- 若两个操作数都是对象,则返回第二个操作数。
- 若第一个操作数是null、NaN、undefinded,则返回null、NaN、undefinded
逻辑与是短路操作,如果第一个操作数能决定结果,就不会对第二个操作数求值
var found = true;
var result = (found && someUndefindVariable);//someUndefindVariable未定义,发生错误
alert(result);//不会执行
var found = false;
var result = (found && someUndefindVariable);//someUndefindVariable未定义,但不会发生错误
alert(result);//执行
逻辑或(||)
两个操作数都是假时,返回假
在有一个操作数不是布尔值的情况下,逻辑与操作不一定返回布尔值。
- 若第一个操作数是对象,则返回第一个操作数
- 若第一个操作数的求值结果为false,则返回第二个操作结果
- 若两个操作数都是对象,则返回第一个操作数。
- 若第一个操作数是null、NaN、undefinded,则返回null、NaN、undefinded
逻辑或也是短路操作。
利用逻辑或的短路行为来避免为变量赋null或者undefined的值。
var myObject = preferredobject || backupObject
变量preferredobject 包含优先赋给myObject的值,变量backupObject负责在perferredobject中不包含有效值的情况下提供后备。
如果perferredObject的值不是null,则将它赋给myObject;如果perferredObject的值为null,则将backupObject的值赋给myObject。
乘性操作符
乘法,除法,求模
乘法(*)
- 如果两个操作符都是数值,执行常规的乘法计算。两个正数相乘或两个负数相乘结果还是正数。如果有只有一个操作符有符号,结果就是负数。
- 如果有一个操作数是NaN,结果就是NaN
- Infinity与0相乘,结果还是Infinity
- Infinity与非0数值相乘,结果为Infinity或者-Infinity
- 如果有一个操作数不是数值,则在后台调用Number()将其转换为数值在进行操作。
除法(/)
- 如果两个操作符都是数值,执行常规的乘法计算。两个正数相乘或两个负数相乘结果还是正数。如果有只有一个操作符有符号,结果就是负数。
- 如果有一个操作数是NaN,结果就是NaN
- Infinity被infinity除,结果是NaN
- 0被0除,结果是NaN
- 非零的有限数被零除,结果是Infinity或-Infinity
- Infinity被任何非零数除,结果是Infinity或者是-Infinity
- 如果有一个操作数不是数值,则在后台调用Number()将其转换为数值在进行操作。
求模(%)
- 若操作数都是数值,执行常规的除法运算
- 若被除数是无穷大值而除数是有限大的值,结果为NaN
- 若被除数是有限大值而除数是0,结果为NaN
- Infinity被infinity除,结果是NaN
- 若被除数是有限大值而除数是无穷大的值,结果为被除数
- 被除数是零,结果为0
- 如果有一个操作数不是数值,则在后台调用Number()将其转换为数值在进行操作。
加性操作符
加法 减法
加法(+)
- 有一个操作数是NaN,结果是NaN
- Infinity+Infinity = Infinity
- -infinity±infinity = -infinity
- infinity+ -infinity = NaN
- 0+0=0
- -0+ -0= -0
- -0+0 = 0
- 如果两个操作数都是字符串,则拼接
- 有一个是字符串,将另一个转换为字符串然后拼接
var num1 = 10;
var num2 = 220;
var message = "The result is"+num1+num2;
alert(message);//"The result is 10220"
修改:
var num1 = 10;
var num2 = 220;
var message = "The result is"+(num1+num2);
alert(message);//"The result is 230"
减法(-)
- 有一个操作数是NaN,结果是NaN
- 同号Infinity相减结果为NaN
- 异号Infinity相减结果为Infinity,符号和被减数相同
- 0-0=0
- -0- 0= -0
- -0- -0 =0
- 如果有一个操作数为字符串,布尔值,null,undefinded,则先调用Number()将其转换为数值,在计算.
- 如果有一个操作数是对象,调用valueOf()或toString()方法取得数值,再进行运算
关系操作符
var result = "Brick"<"alphabet";//true,比较的是字符编码
result = "Brick".toLowerCase()<"alphabet".toLowerCase();//false
result = "23"<"3";//true,两个都是字符串,比较的是编码
result = "23"<3;//false,“23”变成了数值
result = "a"<3;//false,"a"变成了NaN
var result1 = NaN>3;//false
var result2 = NaN<=3;//false