操作符包括
- 算术操作符
- 位操作符
- 关系操作符
- 相等操作符
一元操作符
一元操作符只有一个操作数
1.递增(++)和递减(–)操作符
可用于字符串、布尔值、浮点数、整数和对象,操作数自加1或自减1
分为:前置型、后置型
- 前置型
在语句中,前置型先进行自加或自减,再执行操作
var age=29;
++age; //30
--age; //29
- 后置型
在语句中,先进行操作,再进行自加或自减
var age=29;
age++; //30
age--; //29
单独看不能发现两者的区别,看以下例子,能够明显的看出前置与后置的区别:
var age1=29;
var anotherAge1= --age + 2; //30
var age2=29;
var anotherAge2= age-- + 2; //31
递增和递减操作遵循规则:
应用于包含有效数字字符的字符串时,先将其转换为数字值,再执行加减1的操作
应用于不包含有效数字字符的字符串时,将变量的值设置为NaN
应用于boolean值时,先将其转换为数值,在执行操作
应用于浮点数时,直接执行操作
应用于对象时,先调用valueOf(),如果结果正确,直接执行操作;如果结果为NaN,调用toString()在执行操作
2.一元加减操作
- 当将一元加操作符放在数值前,对数值不会产生任何影响;在对非数值应用一元加操作符时,该操作符会像Number()转型函数一样对这个值进行转换
- 一元减操作符主要用于表示负数,一元减操作符的转换规则和一元加操作符一样
var s1 = +"01"; //1
var s2 = +1.1; //1.1
var s3 = +"1.1"; //1.1
var s4 = +"z; //NaN
var s5 = +false; //0
var s6 = {
valueOf:function(){
return -1;
}
};
s6=+s6; //-1
var s1 = -"01"; //-1
var s2 = -1.1; //-1.1
var s3 = -"1.1"; //-1.1
var s4 = -"z; //NaN
var s5 = -false; //0
var s6 = {
valueOf:function(){
return -1;
}
};
s6=-s6; //1
位操作符
按内存中表示数值的位来操作数值,先将64位的值转换为32位,执行位操作,再转换回64位数值
NaN、Infinity当0来处理,非数值调用Number()
按位非(~)
返回数值的反码。本质: 操作数的负值减1。
按位非是数值表示的最底层执行操作,所以速度比取负减1更快
var num=25;
num=~num; //-26
按位与(&)
有两个操作数。本质: 将两个数值的每一位对齐,对相同位置上的两个数执行AND操作:
1 & 1=>1
1 & 0=>0
0 & 1=>0
0 & 0=>0
var result=25 & 3; //1
以上例子是将25和3转换位二进制,逐位进行AND操作
按位或(|)
有两个操作数。
1 | 1=>1
1 | 0=>1
0 | 1=>1
0 | 0=>0
var result=25 | 3; //27
按位异或(^)
有两个操作数。相异为1.
1 ^ 1=>0
1 ^ 0=>1
0 ^ 1=>1
0 ^ 0=>0
var result=25 ^ 3; //26
左移(<<)
将数值的所有位向左移动指定的位数(移动的是二进制)
左移不会影响符号位
var num=2;
num=num<<5; //64
以上例子是将2转为二进制10,将10向左移动5位,添0,即1000000,就是二进制的64
有符号右移(>>)
将数值向右移动,但保留符号位,有符号的右移和左移恰好相反。
用符号位的数值来填充
var num=64;
num=num>>5; //2
var num=-2;
num=num>>5; //-1
无符号右移(>>>)
这个操作符会将32位都向右移动,对正数来说,无符号右移得结果和有符号右移的结果相同。但对负数来说,无符号右移是用0来填充。
无符号右移会把负数的二进制码当作正数的二进制码
var num=-64;
num=num>>>5; //134217726
有关位运算的简单计算由此去========》go
布尔操作符(逻辑运算符)
&&
运算是与运算,只有所有都为true,&&运算结果才是true;
true && true => true
true && false => false
false && true => false
false && false => false
逻辑与操作可以应用于任何类型的操作数,而不仅仅是布尔值,在有一个操作数不是布尔值的情况下,逻辑与操作不一定返回布尔值:
1.如果第一个操作数是对象,则返回第二个操作数
2.如果第二个操作数是对象,则只有在第一个操作数的求值结果为true的情况下才返回该对象
3.如果两个操作数都是对象,则返回第二个操作数
4.如果第一个操作数是null,则返回null
5.如果第一个操作数是NaN,则返回NaN
6.如果第一个操作数是undefined,则返回undefined
逻辑与是短路操作,即如果第一个操作数能够决定结果,那么就不会对第二个操作数求值。逻辑与操作中,当第一个操作数是false时,则无论第二个操作数是什么值,结果都是false
var found=true;
var result=found&&someElement; //报错
var found=false;
var result=found && someElement; //不会发生错误,result为false
||
运算是或运算,只要其中有一个true,||运算结果都为true;
true || true => true
true || false =>true
false || true => true
false || false => false
与逻辑与相似,如果有一个操作数不是布尔值,则结果不一定是布尔值:
1.如果第一个操作数是对象,则返回第一个操作数
2.如果第一个操作数的求值结果为false,则返回第二个操作数
3.如果两个操作数都是对象,则返回第一个操作数
4.如果两个操作数都是null,则返回null
5.如果两个操作数都是NaN,则返回NaN
6.如果两个操作数都是undefined,则返回undefined
逻辑或也是短路操作
var found=true;
var result=found || someElement; //不会发生错误,结果为true
var found=false;
var result=found || someElement; //报错
!
运算是非运算,他是一个单目运算符,把true变成false,把false变为true;
将他的操作数转为一个布尔值,然后求其反
1.如果操作数是对象,则返回false
2.如果操作数是一个空字符串,则返回true
3.如果操作数是一个非空字符串,则返回false
4.如果操作数是0,则返回true
5.如果操作数是任意非0数值(包括Infinity),则返回false
6.如果操作数是null,则返回true
7.如果操作数是NaN,则返回true
8.如果操作数是undefined,则返回true
!false; //true
!"blue"; //false
!0; //true
!NaN; //true
!""; //true
!12345; //false
!!
模拟Boolean()转型函数,获得一个值对应的布尔值
乘性操作符
乘(*)
用于计算两个操作数的乘积
处理特殊值的规则:
1.有一个操作数是NaN===>NaN
2.Infinity * 0==>NaN
3.Infinity * 非0数值===>Infinity/-Infinity(取决于符号)
4.Infinity * Infinity===>Infinity
5.乘积超过数值的表示范围 ,返回Infinity/-Infinity(取决于符号)
6.如果有一个操作数不是数值,在后台调用Number(),然后应用上面的规则
除(/)
处理特殊值的规则:
1.有一个操作数是NaN===>NaN
2.0 / 0,返回NaN
3.非0数值 * 0,返回Infinity/-Infinity(取决于符号)
4.Infinity / Infinity,返回NaN
5…Infinity /任意非0数值,返回Infinity/-Infinity(取决于符号)
6.乘积超过数值的表示范围 ,返回Infinity/-Infinity(取决于符号)
7.如果有一个操作数不是数值,在后台调用Number(),然后应用上面的规则
求模(%)
返回余数
处理特殊值的规则:
1.被除数无穷大而除数有限大(无穷大%有限大),返回NaN
2.有限大的值 % 0,返回NaN
3.被除数有限大除数无穷大,返回被除数
4.Infinity % Infinity,返回NaN
5.0%任意数,返回0
6.如果有一个操作数不是数值,在后台调用Number(),然后应用上面的规则
加减操作符
加法(+)
如果两个操作数都是数值,执行常规的加法计算,然后根据规则返回结果
1.如果有一个操作数是NaN,则返回NaN
2.Infinity + Infinity = Infinity
3.-Infinity + -Infinity = -Infinity
4.Infinity + -Infinity = NaN
5.+0 + +0 = +0
6.-0 + -0 = -0
7.+0 + -0 = +0
8.有一个操作数是字符串:①如果两个操作数都是字符串,则第二个操作数与第一个操作数拼接起来;②如果只有一个操作数是字符串,则将另一个操作数转换为字符串,饭后拼接起来
9.如果有一个操作数是对象、数值、或布尔值,则调用他们的toString()方法取得对应的字符串值,在应用前面的规则
10.对于null、undefined,调用String()获得字符串值
var num=5+5; //10
var result=5+"5"; //55
var num1=5;
var num2=10;
var message="The sum of 5 and 10 is "+num1+num2;
//"The sum of 5 and 10 is 510"
减法(-)
规则:
1.如果有一个操作数是NaN,则返回NaN
2.Infinity - Infinity = NaN
3.-Infinity - -Infinity = NaN
4.Infinity - -Infinity = Infinity
5.-Infinity - Infinity = -Infinity
6.+0 - +0 = +0
7.-0 - +0 = -0
8.-0 - -0 = +0
9.有一个操作数是字符串、布尔值、null或undefined:先在后台调用Number()函数将其转换为数值,然后根据前面的规则执行
10.如果有一个操作数是对象,则调用valueOf()取得该对象的数值,如果得到NaN,则减法结果为NaN;如果没有valueOf(),则调用toString()方法取得对应的字符串值,并将其转换为数值。
var num1=5-true; //4
var num2=NaN-1; //NaN
var num3=5-3; //2
var num4=5-""; //5
var num5=5-"2"; //3
var num6=5-null; //5
关系操作符
小于(<)、大于(>)、小于等于(<=)、大于等于(>=)
相等运算符
实际上,JavaScript允许对任意数据类型作比较,但特别要注意相等于算符。JavaScript在设计时,有两种比较运算符:
第一种是==
,它会自动转换类型再比较。!=
:不相等
第二种是===
,他不会自动转换类型,如果两个表达式(包括他们的数据类型)相等,则结果为true。!==
:不全等
注意: NaN与其他的值都不想等,包括他自己,唯一能判断NaN的方法是通过isNaN
()函数:
isNaN(NaN);//true
最后要注意的浮点数的比较:
1/3===(1-2/3);//false
浮点数在运算过程中会产生误差,因为计算机无法精确表示无限循环小数。要比较两个浮点数是否相等,只能计算他们之差的绝对值,看是否小于某个阙值:
Math.abs(1/3-(1-2/3))<0.0000001;//true
相等和不相等的转换规则
1.如果有一个布尔值,将布尔值转换为数值
2.有一个字符串,另一个是数值,则将字符串转换为数值
3.一个是对象,另一个不是,则调用valueOf(),将得到的值按照 前面的规则执行
4.null和undefined是相等的
5.在比较相等前,不能将null和undefined转换为其他值
6.有一个是NaN,则结果是 false
7.两个操作数都是对象,则比较他们是不是同一个对象
null==undefined //true
"NaN"==NaN //false
5==NaN //false
NaN==NaN //false
NaN!=NaN //true
false==0 //true
true==1 //true
true==2 //false
undefined==0 //false
null==0 //false
"5"==5 //true
全等:
null===undefined //false
三元运算符(条件操作符)
variable=boolean_expression?true_value:false_value
var max=(num1>num2)?num1:num2
上面的例子是说,当num1大于num2时,max等于num1,否则等于num2
赋值操作符
简单的赋值操作符就是=,其作用就是把右边的值赋给左边的变量
复合赋值操作符:
- 乘/赋值 *=
- 除/赋值 /=
- 膜/赋值 %=
- 加赋值 +=
- 减/赋值 -=
- …
逗号操作符
使用逗号操作符可以在一条语句中执行多个操作
var num1=1,num2=9,num4=8;
var num=(5,6,7,2,0);//num=
运算符的优先级
- ()
- 一元运算符
- 算术运算符
- 关系运算符
- 相等运算符
- 逻辑运算符
- 赋值运算符