一元操作符
只操作一个值的操作符叫做一元操作符,常见的一元操作符有+、-、++、--
等。
递增与递减操作符
递增(++
)和递减(--
)操作符功能与C语言相同,都是在原值的基础上实现自增和自减的效果。
按照赋值时机划分,递增/递减操作符可以分为分为前置递增/递减操作符和后置递增/递减操作符,他们主要的区别是:
- 前置递增/递减操作符先对变量的值进行递增/递减,再返回该值。
- 后置递增/递减操作符则恰好相反,即先返回该值,再对变量的值进行递增/递减。
1
2
3
4
var a = 20;
var ans1 = (++a)++;
console.log(ans1); // 21
console.log(a); // 22
递增与递减操作符不仅可以用于数字类型,还可以用于布尔、字符串等其他类型,应用时遵循如下规则:
- 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减1的操作。字符串变量变成数值变量。
- 在应用于一个不包含有效数字字符的字符串时,将变量的值设置为 NaN。字符串变量变成数值变量。
- 在应用于布尔值
false
时,先将其转换为0
再执行加减1的操作。布尔值变量变成数值变量。 - 在应用于布尔值
true
时,先将其转换为1
再执行加减1的操作。布尔值变量变成数值变量。 - 在应用于浮点数时,直接执行加减1操作。
- 在应用于对象时,先调用对象的
valueOf()
方法,提供一个可用的值,在按照前面的规则执行;如果结果是NaN
,那么再调用对象的toString()
方法。对象变成数值变量。
一元加减操作符
一元加操作符
一元加操作符用+
表示,放在值之前,对数值不会产生任何影响。但一元加操作符用在非数值类型的值之前,会对该类型进行转换,布尔会变成0或1,字符串会按照一定的规则进行解析,对象则会调用valueOf()
或者toString()
方法。
一元减运算符
一元减运算符主要用于表示负数,如果应用在数值类型上,则会将该值变为他的相反数;如果应用在非数值类型上, 将会进行类型转换,再取相反数。
布尔操作符
布尔操作符主要用于条件判断,在编程语言中具有相当重要的作用,主要包括逻辑与、逻辑或和逻辑非。
逻辑非
逻辑非由一个叹号(!
)组成,可以用于任何类型,返回一个布尔值,遵循下面的规则:
- 如果操作数是一个对象,返回
false
(除了null以外的所有对象都可以看成true
,取反后自然会变成false
) - 如果操作数是空字符串,返回
true
- 如果操作数是非空字符串,返回
false
- 如果操作数是数值0,返回
true
- 如果操作数是任意非0数值,返回
false
- 如果操作数是
null
,返回true
- 如果操作数是
undefined
,返回true
- 如果操作数是
NaN
,返回true
逻辑与
逻辑与在这里不再赘述,根据真值表,只有当两个条件同时为真,结果才能为真。逻辑与可以应用于任何类型。但当有一个操作数不为布尔类型时,结果就不一定为布尔类型了。遵循如下规则:
- 如果第一个操作数是对象,则返回第二个操作数;
- 如果第二个操作数是对象,则只有在第一个操作数的求值结果为
true
的情况下才会返回该对象; - 如果两个操作数都是对象,返回第二个操作数;
- 如果有一个操作数是
null
,返回null
; - 如果有一个操作数是
undefined
,返回undefined
; - 如果有一个操作数是
NaN
,返回NaN
逻辑与操作属于短路操作,只要第一个操作数能够决定结果,就不再会对第二个操作数求值,如果第一个数为false
,则直接返回false
,不会再考虑第二个数,哪怕第二个数未定义都不会引起错误。
逻辑或
逻辑或在这里不再赘述,根据真值表,只要两个条件其中之一为真,结果就为真。它遵循如下规则:
- 如果第一个操作数是对象,则返回第一个操作数;
- 如果第一个操作数是false,返回第二个操作数;
- 如果两个操作数都是对象,返回第一个操作数;
- 如果两个操作数都是
null
,返回null
; - 如果两个操作数都是
undefined
,返回undefined
; - 如果两个操作数都是
NaN
,返回NaN
逻辑或操作也属于短路操作,只要第一个操作数能够决定结果,就不再会对第二个操作数求值。如果第一个数为true
,则直接返回true
,不会再考虑第二个数,哪怕第二个数未定义都不会引起错误。
二元操作符
乘性操作符
乘法(*)、除法(/)、取模(%)
,这些操作符和C类似,在进行非数值型的运算时会使用Number()
自动转换类型。
特别注意的是:0/0得到NaN,正数/0得到Infinity,负数/0得到-Infinity。
加性操作符
加法(+)、减法(-)
,他们的作用也和C类似,但是加法运算符还有一些区别。
如果加法两侧操作数为字符串,则进行字符串拼接操作;如果一个操作数是字符串,另一个操作数是数值,则将另一个操作数转换为字符串,返回拼接后的字符串。
关系操作符
小于(<)、大于(>)、大于等于(>=)、小于等于(<=)
,这几个关系操作符和C语言功能一样,均根据两个操作数的大小关系返回布尔值,这里不再赘述。
关系运算符也可以应用于任何类型,遵循下列规则:
- 如果两个操作数都是数值,执行数值比较;
- 如果两个操作数都是字符串,按照Unicode编码大小进行比较;
- 如果一个操作数是数值,则将另一个操作数转换为数值再进行比较;
- 如果一个操作数是对象,调用
valueOf()
、toString()
后按照前面规则比较; - 如果一个操作数是布尔值,将其转成数值再进行比较。
- 如果一个操作数是
NaN
,无论如何都返回false
,因为无法比较。
由于字符串比较的特殊性,我们通常比较字符串
toLowerCase
后的结果。
相等操作符
ES里相等比较符主要有:等值(==)、全等(===)、非等值(!=)、非全等(!==)
四种。
等值与不等值
ES中不同类型的值也可以判断是否相等,使用==
来判断两个值是否相等,使用!=
来判断两个值是否不想等,比较遵循下列原则:
- 如果有一个操作数是布尔值,若为
true
则转换成1,为false
则转换成0。 - 如果有一个操作数是字符串,比较前先将字符串转成数值。
- 如果一个操作数是对象,则调用
valueOf()
方法转换成基本类型后再比较。 null
和undefined
是相等的。- 比较相等性时,不能将
null
和undefined
转换成其他值。 - 如果一个操作数是
NaN
,则相等操作符返回false
;若两个操作数是NaN
,同样返回false
,任何NaN都不相等。 - 如果两个操作数是对象,则判断两个操作数是否是同一引用。
下面是一些例子:
1
2
3
4
5
6
7
8
9
10
11
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
全等和不全等
ES中三个等号===
表示全等,全等不仅要求值相等,还要求两个值具有相同的类型:
1
2
5 == "5" // true
5 === "5" // false
三元操作符
三元操作符是指条件操作符,它的基本格式是这样的:condition ? true_statement : false_statement
,如果条件为true
则执行true_statement
,否则执行false_statement
。