常见运算符
算术运算符
- 加法
+
,如2 + 3
,注意但凡遇到字符串,则作拼接作用,如2 + '3'
、'2' + 3
、'2' + '3'
结果都是字符串 ‘23’; - 减法
-
,如2 - 3
; - 乘法
*
,如2 * 3
; - 除法
/
,如2 / 3
; - 取余
%
,如3 % 2
,表示 3÷2 的余数; - 求幂
**
,如3 ** 2
,表示 32。
逻辑运算符
逻辑运算是好玩的,也是相对简单的,这里不展开叙述。
- 与(
&&
) - 或(
||
) - 非(
!
) - 空值合并运算符(
??
)
位运算符
位运算不常见,一般可用于解决内存效率问题、底层运算问题、加密问题等。
- 按位与 (
&
) - 按位或 (
|
) - 按位异或 (
^
) - 按位非 (
~
) - 左移 (
<<
) - 右移 (
>>
) - 无符号右移 (
>>>
)
比较运算符
- 比较的结果是布尔值
true
或false
; - 常见的如,
>
、<
、<=
、>=
、==
; - 严格相等
===
,严格不相等!==
,比如0 !== ''
、null !== undefined
; - 下面展示,一些特殊类型的数据比较(如
null
、字符串、布尔值、NaN
、undefined
)。
/* 与布尔值的比较 */
0 == false == '' // true
1 == true // true
0 !== false // true
/* null、NaN、undefined */
null == undefined // true
null !== undefined // true
null != NaN // true
null >= 0 // true,null 包含空、无或值未定的概念
/* 下面关于 null 判断结果都是 false
null == 0、null > 0、null < 0、null <= 0
*/
NaN != NaN // true,任何一个 NaN 实例都是独特的
undefined != 0 // true,undefined 的含义是未定义
/* 下面关于 undefined 判断结果都是 false
undefined > 0、undefined < 0、undefined == 0、undefined >= 0、undefined <= 0
*/
---------------
/* 字符串的比较:
比较字符的码值,从左到右比较,直到比较出结果 */
'abc' > 'abCD' // true
'abc' == 'abc' // true
赋值运算符
- 简单的复制运算符,就是一个等于号,即
=
; - 配合算术运算符,如
+=
、/=
、**=
等; - 配合逻辑运算符,如
||=
、??=
等; - 配合位运算符,如
<<=
、&=
等; - 链式赋值,如
a = b = 2
。
let a = 2;
a += 1 // a=3
a ^= 0b1 // a=1
自增、自减
- 自增
++
,将变量与 1 相加; - 自减
--
,将变量与 1 相减; - 操作数据必须是数。
let a = 100;
a ++; // 101
a --; // 100
'0' ++; // Error
一元运算符、三元运算符
- N元运算符,表示操作数据是N个;
- 一元运算符:
+
,用于将数据转换成数字;-
,用于取一个数的负值。
- 三元运算符:
?:
,等效于一个简单的条件判断语句,可以像if
语句一样嵌套。
+'12' // 12 - 数值
+'' // 0 - 数值
+true // 1 - 数值
/* 符号函数:如果x>0,返回1,否则-1 */
function sign(x) {
return x > 0 ? 1: -1; // x > 0 ? 1: -1 算是一个表达式,值取决于 ? 前面的条件
}
其他常见运算符
typeof
new
in
await
delete
void
instanceof
运算符与优先级 - 汇总表
一张比较完整的汇总表,值越大优先级越高。
优先级 | 运算符类型 | 结合性 | 运算符 |
---|---|---|---|
19 | 分组 | n/a(不相关) | ( … ) |
18 | 成员访问 | 从左到右 | … . … |
18 | 需计算的成员访问 | 从左到右 | … [ … ] |
18 | new (带参数列表) | n/a | new … ( … ) |
18 | 函数调用 | 从左到右 | … ( … ) |
18 | 可选链(Optional chaining) | 从左到右 | ?. |
17 | new (无参数列表) | 从右到左 | new … |
16 | 后置递增 | n/a | … ++ |
16 | 后置递减 | n/a | … -- |
15 | 逻辑非 (!) | 从右到左 | ! … |
15 | 按位非 (~) | 从右到左 | ~ … |
15 | 一元加法 (+) | 从右到左 | + … |
15 | 一元减法 (-) | 从右到左 | - … |
15 | 前置递增 | 从右到左 | ++ … |
15 | 前置递减 | 从右到左 | -- … |
15 | typeof | 从右到左 | typeof … |
15 | void | 从右到左 | void … |
15 | delete | 从右到左 | delete … |
15 | await | 从右到左 | await … |
14 | 幂 (**) | 从右到左 | … ** … |
13 | 乘法 (*) | 从左到右 | … * … |
13 | 除法 (/) | 从左到右 | … / … |
13 | 取余 (%) | 从左到右 | … % … |
12 | 加法 (+) | 从左到右 | … + … |
12 | 减法 (-) | 从左到右 | … - … |
11 | 按位左移 (<<) | 从左到右 | … << … |
11 | 按位右移 (>>) | 从左到右 | … >> … |
11 | 无符号右移 (>>>) | 从左到右 | … >>> … |
10 | 小于 (<) | 从左到右 | … < … |
10 | 小于等于 (<=) | 从左到右 | … <= … |
10 | 大于 (>) | 从左到右 | … > … |
10 | 大于等于 (>=) | 从左到右 | … >= … |
10 | in | 从左到右 | … in … |
10 | instanceof | 从左到右 | … instanceof … |
9 | 相等 (==) | 从左到右 | … == … |
9 | 不相等 (!=) | 从左到右 | … != … |
9 | 一致/严格相等 (===) | 从左到右 | … === … |
9 | 不一致/严格不相等 (!==) | 从左到右 | … !== … |
8 | 按位与 (&) | 从左到右 | … & … |
7 | 按位异或 (^) | 从左到右 | … ^ … |
6 | 按位或 (|) | 从左到右 | … | … |
5 | 逻辑与 (&&) | 从左到右 | … && … |
4 | 逻辑或 (||) | 从左到右 | … || … |
4 | 空值合并 (??) | 从左到右 | … ?? … |
3 | 条件(三元)运算符 | 从右到左 | … ? … : … |
2 | 赋值 | 从右到左 | … = … |
2 | 赋值 | 从右到左 | … += … |
2 | 赋值 | 从右到左 | … -= … |
2 | 赋值 | 从右到左 | … **= … |
2 | 赋值 | 从右到左 | … *= … |
2 | 赋值 | 从右到左 | … /= … |
2 | 赋值 | 从右到左 | … %= … |
2 | 赋值 | 从右到左 | … <<= … |
2 | 赋值 | 从右到左 | … >>= … |
2 | 赋值 | 从右到左 | … >>>= … |
2 | 赋值 | 从右到左 | … &= … |
2 | 赋值 | 从右到左 | … ^= … |
2 | 赋值 | 从右到左 | … |= … |
2 | 赋值 | 从右到左 | … &&= … |
2 | 赋值 | 从右到左 | … ||= … |
2 | 赋值 | 从右到左 | … ??= … |
1 | 逗号 / 序列 | 从左到右 | … , … |