- 一元操作符
只能操作一个值的操作符叫做一元操作符
(1)递增和递减操作符,前置型和后置型
let a = 10;
let b = 2;
let c = --a + b//11
let a = 10;
let b = 2;
let c = a-- + b//12
(2)一元加和减操作符
一元加以一个(+)表示,放在数值前面,对数值不会产生任何影响;一元减主要表示负数
+20//20
-20//-20
(3)布尔操作符
逻辑非(!)
可以应用于ECMAScript中的任意值,无论这个值是什么类型,都会返回一个布尔值。逻辑非首先会将它的操作数转化为一个布尔值,然后对其取反
操作数 | 返回值 |
---|---|
!{} | false |
!"" | true |
!“你好吗” | false |
!0 | true |
!(非0数值(包含Infinity)) | false |
!null | true |
!NaN | true |
!undifined | true |
同时使用2个!!,会模拟Boolean()转型函数的行为
逻辑与(&&)
逻辑与操作属于短路操作,即第一个操作数能够决定结果,那么就不会对第二个操作数求值
真值表:
第一个操作数 | 第二个操作数 | 结果 |
---|---|---|
true | true | true |
false | true | false |
true | false | false |
false | false | false |
逻辑与操作可以用于任何类型的操作数,而不仅仅是布尔值,在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值,它遵循下列规则:
第一个操作数 | 第二个操作数 | 结果 |
---|---|---|
object | any | 返回第二个操作数 |
any | object | 当第一个个求值结果为true时才返回该对象 |
null | any | null |
NaN | any | NaN |
undefined | any | undefined |
逻辑或(||)
真值表:
第一个操作数 | 第二个操作数 | 结果 |
---|---|---|
true | true | true |
false | true | true |
true | false | true |
false | false | false |
逻辑或操作可以用于任何类型的操作数,而不仅仅是布尔值,在有一个操作数不是布尔值的情况下,逻辑或操作就不一定返回布尔值,它遵循下列规则:
第一个操作数 | 第二个操作数 | 结果 |
---|---|---|
object | any | 返回第一个操作数 |
false | object | 当第一个求值结果为false时才返回第二个操作数 |
object | object | 返回第一个操作数 |
null | null | null |
NaN | NaN | NaN |
undefined | undefined | undefined |
(4)乘性操作符
如果参与乘性计算的某个操作数不是数值,后台会先调用Number()函数将其转化为数值,也就是说空字符串将被当作0,布尔true将被当作1
乘法
如果操作数都是数值,执行常规的乘法计算,即两个正数相乘或两个负数相乘的结果还是正数,如果有一个为负数,那么结果为负数。如果乘积超过了ECMASript的范围,则返回Infinity或-Infinity。
操作数 | 结果 |
---|---|
有一个是NaN | NaN |
Infinity*0 | NaN |
Infinity*非0 | Infinity |
Infinity | Infinity |
除法
如果操作数都是数值,执行常规的除法计算,即两个正数相除或两个负除相乘的结果还是正数,如果有一个为负数,那么结果为负数。如果商超过了ECMASript的范围,则返回Infinity或-Infinity。
操作数 | 结果 |
---|---|
有一个是NaN | NaN |
Infinity/Infinity | NaN |
0/0 | NaN |
非0的有限数被0除 | Infinity或-Infinity |
Infinity/非0的有限数 | Infinity或-Infinity |
求模(%)
如果操作数都是数值,执行常规的除法计算,返回除得的余数
操作数 | 结果 |
---|---|
无穷大%有限大 | NaN |
有限大数值%0 | NaN |
Infinity%Infinity | NaN |
有限大的数值%无穷大的数值 | 结果是被除数 |
除数是0 | 0 |
(5)加性操作符
加法(+)
如果两个操作符都是数值,执行常规的加法计算,根据下列结果返回结果:
操作数 | 结果 |
---|---|
有一个为NaN | NaN |
Infinity+Infinity | Infinity |
-Infinity + -Infinity | -Infinity |
Infinity+ -Infinity | NaN |
0+0 | 0 |
-0 + -0 | -0 |
0+ -0 | 0 |
如果有一个操作数是字符串,则将另一个操作数转化为字符串,然后与第一个操作数拼接。如果都是字符串,则将第一个和第二个拼接起来
如果有一个操作数是undefine、null、对象、数值或者布尔值,则调用他们的toString()方法取得相对应的字符串,然后在执行字符串拼接,
减法(-)
如果两个操作符都是数值,执行常规的减法计算,根据下列结果返回结果:
操作数 | 结果 |
---|---|
有一个为NaN | NaN |
Infinity-Infinity | NaN |
Infinity - -Infinity | Infinity |
-Infinity - Infinity | -Infinity |
-Infinity- -Infinity | NaN |
0-0 | 0 |
-0 - 0 | -0 |
-0 - -0 | 0 |
如果有一个操作数是对象,则调用对象的valueOf()方法取得该对象的数值,如果没有valueOf()方法,则调用toString()方法,如果转化结果为NaN,则结果为NaN
如果有一个操作数是undefine、null、字符串或者布尔值,则调用他们的number()方法取得相对应的数值,然后在执行计算,如果转化结果为NaN,则结果为NaN
(6)关系操作符(<)、(>)、(<=)、(>=)
如果两个操作数都是数值,则执行数值比较
如果两都是字符串,则比较两个字符串对应的字符编码值
如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较
如果一个操作数是对象,则调用valueOf()方法,用得到的结果按照前面的比较,如果没有valueOf()方法,则调用toString()方法,然后按照字符串比较
如果一个操作数是布尔值,则先将其转化为数值,然后再执行比较
(7)相等操作符
相等不相等先转化在比较,全等不全等仅比较而不转换
如果有一个操作数是布尔值,先将其转化为数值,false转化为0,true转化为1;
如果一个操作数是字符串,另一个是数值,先将字符串转化为数值然后比较;
如果一个操作数是对象,另一个不是,则先调用valueOf()方法,用得到的基本类型值再按照前面的规则进行比较;
null和undefined是相等的;
Nan和任何值都不相等,包括它本身;
如果两个操作数都是对象,则比较它们是不是同一个对象
(8)条件操作符
let a = 2>0 ? 1 : 0// 1
(9)复制操作符(=)
每个主要算术操作符,都有对应的符合赋值操作符
操作符 | |
---|---|
乘 | *= |
除 | /= |
模 | %= |
加 | += |
减 | -= |
左移 | <<= |
有符号右移 | >>= |
无符号右移 | >>>= |
(10)逗号操作符
let a=1,b=2,c=3//一条语句中执行多个操作
let d=(4,5,6,1)//1 用于赋值是逗号操作符总返回表达式中的最后一项