Expression Operation

28 阅读3分钟

在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=赋值、运算赋值
2yield yield*yield 表示式
1展开
0,多重求值

【参考资料】

《JavaScript 语言精髓与编程实践》第3版 章节2