在JavaScript 中,运算符(操作符)大多数是特殊符号,但也有少量单词。
运算符/符号 | 运算符含义 |
---|---|
typeof | 取变量或值的类型 |
void | 运算表达式并忽略值,返回undefined |
new | 创建指定类的对象实例 |
instanceof | 检查变量是否指定类的实例 |
delete | 删除实例属性 |
yield | 从生成器内部返回一个值 |
await | 在异步函数内等待一个值 |
表达式有运算符与操作数构成。操作数除了包括变量,还包括函数(或方法)的返回值,也包括字面量。但JS 中也可以存在没有运算符的表达式,称为“单值表达式”。单值表达式有值的含义,表达式的结果即是该值,主要包括:
- this、super、new.target 和arguments 引用
- 变量引用,即一个已声明的标识符
- 字面量,包括null、undefined、字符串、布尔值、数值、模板、正则表达式
在ES6 中,将以下表达式与单值表达式一起称为基本表达式(Primary Expression):
- 数组字面量
- 对象字面量
- 函数字面量
- 表达式分组运算
一个JS 表达式中必然存在至少一个运算符。运算符可以有一至三个操作数,没有操作数的、孤立于代码上下文的运算符是不符合语法的。
一般表达式运算
逻辑运算
- !
- ||
- &&
字符串运算
在历史中,JavaScript 中有且仅有一种字符串运算 — 字符串连接(“+”)。字符串连接运算总是产生一个新的字符串,等同于字符串对象的concat 方法。
数值运算
-
加减乘除
-
前缀版/后缀版递增、递减运算(区别:后缀版递增和递减在语句被求值后才发生)
-
位运算
- 在位运算操作中,JS 强制运算目标为一个有符号的32 位整型数:如果目标是非数值,那么会被强制转换为数值;如果目标是浮点数,那么会被取整;否则将目标识别为有符号整型数
- ~(按位非):返回数值的一补数
- &(按位与):按位与操作在两个位都是1 时返回1,在任何一位是0 时返回0
- |(按位或):按位或操作在至少一位是1 时返回1,两位都是0 时返回0
- ^(按位异或):只在一位上是1 时返回1(两位都是1 或0时,返回0)
- <<
>>
-
取模
比较运算
- 等值检测(Equality Operators)
- 关系运算(Relational Operators,包括序列检测等)
赋值运算
一般赋值运算符
v = e
[v1, v2, ...] = e
{v1, v2, ...} = e
{p: v1, v2, ...} = e
带操作的赋值运算符
v += e
v -= e
v *= e
v /= e
v %= e
v <<= e
v >>= e
v >>>= e
v &= e
v |= e
v ^= e
自增/自减运算符
++v
v--
函数相关的表达式
- 匿名函数、箭头函数
- 函数调用
- new 运算
特殊作用的运算符
- typeof
- spread syntax
- await、void、yield、delete
运算优先级
序数越大,优先级越高
运算符 | 描述 | |||
---|---|---|---|---|
19 | () | 成组运算 | ||
18 | . [] new() | 对象成员存取、数组下标、带参数的new | ||
17 | () new | 函数调用、不带参数的new | ||
16 | ++ -- | 后置递增/递减 | ||
15 | + - ++ -- ~ ! delete typeof void | 前置加减号、递增/递减、逻辑与、按位非,其他 | ||
14 | * / % | 乘法、除法、取模 | ||
13 | + - + | 加法、减法、字符串连接 | ||
12 | << >> >>> | 移位 | ||
11 | < <= > >= in instanceof | 序列检测、in、instanceof | ||
10 | == != === !== | 等值检测 | ||
9 | & | 按位与 | ||
8 | 按位异或 | |||
7 | 按位或 | |||
6 | && | 逻辑与 | ||
5 | 逻辑或 | |||
4 | ?: | 条件 | ||
3 | = oP= | 赋值、运算赋值 | ||
2 | yield yield* | yield 表示式 | ||
1 | … | 展开 | ||
0 | , | 多重求值 |
【参考资料】
《JavaScript 语言精髓与编程实践》第3版 章节2