表达式和运算符
=======

该章节说明了 JavaScript 语言所有的运算符，表达式和关键字。

表达式和运算符分类
---------

要查看按字母顺序排列的列表，请参阅左边的侧边栏。

### 主要表达式

JavaScript 中的基本关键字和常用表达式。

`this`

`this` 关键字指向函数的执行上下文。

`function`

`function` 关键字定义了函数表达式。

`class`

`class` 关键字定义了类表达式。

`function*`

`function*` 关键字定义了一个 generator 函数表达式。

`yield`

暂停和恢复 generator 函数。

`yield*`

委派给另外一个 generator 函数或可迭代的对象。

`async function`

`async function` 定义一个异步函数表达式。

`await`

暂停或恢复执行异步函数，并等待 promise 的 resolve/reject 回调。

`async function*`

`async function*` 定义了一个异步生成器函数表达式。

`[]`

数组初始化/字面量语法。

`{}`

对象初始化/字面量语法。

`/ab+c/i`

正则表达式字面量语法。

`( )`

分组操作符。

### 左表达式

左边的值是赋值的目标。

属性访问符

成员运算符提供了对对象的属性或方法的访问（`object.property` 和 `object["property"]`）。

`new`

`new` 运算符创建了构造函数实例。

`new.target`

在构造器中，`new.target` 指向 `new` 调用的构造器。

`import.meta`

向 JavaScript 模块暴露特定上下文的元数据属性的对象。

`super`

`super` 关键字调用父类的构造器。

`...obj`

展开运算符允许在需要多个参数（用于函数调用）或多个元素（用于数组字面量）的地方展开表达式。

### 自增和自减

前置/后置自增运算符和前置/后置自减运算符。

`A++`

后置自增运算符。

`A--`

后置自减运算符。

`++A`

前置自增运算符。

`--A`

前置自减运算符。

### 一元运算符

一元运算符只有一个操作数。

`delete`

`delete` 运算符用来删除对象的属性。

`void`

`void` 运算符表示表达式放弃返回值。

`typeof`

`typeof` 运算符用来判断给定对象的类型。

`+`

一元加运算符将操作转换为 Number 类型。

`-`

一元减运算符将操作转换为 Number 类型并取反。

`~`

按位非运算符。

`!`

逻辑非运算符。

### 算术运算符

算术运算符以二个数值（字面量或变量）作为操作数，并返回单个数值。

`+`（加）

加法运算符。

`-`

减法运算符。

`/`

除法运算符。

`*`

乘法运算符。

`%`

取模运算符。

`**`

求幂运算符。

### 关系运算符

比较运算符比较两个操作数并返回基于比较结果的布尔值。

`in`

`in` 运算符用来判断对象是否拥有给定属性。

`instanceof`

`instanceof` 运算符判断一个对象是否是另一个对象的实例。

`<`（小于）

小于运算符。

`>`（大于）

大于运算符。

`<=`

小于等于运算符。

`>=`

大于等于运算符。


**备注：** `=>` 不是运算符，而是`箭头函数`的表示符。

### 相等运算符

如果相等，操作符返回的是布尔类型的 true，否则是 false。

`==`

相等运算符。

`!=`

不等运算符。

`===`

全等运算符。

`!==`

非全等运算符。

### 位移运算符

在二进制的基础上对数字进行移动操作

`<<`

按位左移运算符。

`>>`

按位右移运算符。

`>>>`

按位无符号右移运算符。

### 二进制位运算符

二进制运算符将它们的操作数作为 32 个二进制位（0 或 1）的集合，并返回标准的 JavaScript 数值。

`&`

按位与（AND）。

`|`

按位或（OR）。

`^`

位异或（XOR）。

### 二元逻辑运算符

逻辑运算符典型的用法是用于布尔（逻辑）值运算，它们返回布尔值。

`&&`

逻辑与。

`||`

逻辑或。

`??`

空值合并运算符，如果 ?? 前面是 null 或 undefined，取后面的默认值。

### 可选链运算符

* `?.`
    + 如果引用是空值（`null` 或 `undefined`），可选链运算符将返回 `undefined` 而不是导致错误。
### 条件（三元）运算符

`(condition ? ifTrue : ifFalse)`

条件元素运算符把两个结果中其中一个符合运算逻辑的值返回。

### 赋值运算符

赋值运算符将右边的操作数的值分配给左边的操作数。

`=`

赋值运算符。

`*=`

赋值乘积。

`**=`

求幂赋值。

`/=`

赋值商。

`%=`

赋值求余。

`+=`

赋值求和。

`-=`

赋值求差。

`<<=`

左位移。

`>>=`

右位移。

`>>>=`

无符号右位移。

`&=`

赋值与。

`^=`

赋值按位异或。

`|=`

赋值或。

`&&=`

逻辑和赋值运算符。

`||=`

逻辑或赋值运算符。

`??=`

逻辑空赋值运算符。

`[a, b] = arr`, `{ a, b } = obj`

解构赋值允许你使用类似于数组或对象字面量的语法将数组或对象的属性赋值给变量。

### 逗号运算符

逗号操作符 `,`

逗号操作符允许在一个判断状态中有多个表达式去进行运算并且最后返回最后一个表达式的值。

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-addition-operator-plus |
| ECMAScript Language Specification # sec-assignment-operators |
| ECMAScript Language Specification # sec-async-function-definitions |
| ECMAScript Language Specification # sec-async-generator-function-definitions |
| ECMAScript Language Specification # prod-BitwiseANDExpression |
| ECMAScript Language Specification # sec-bitwise-not-operator |
| ECMAScript Language Specification # prod-BitwiseORExpression |
| ECMAScript Language Specification # prod-BitwiseXORExpression |
| ECMAScript Language Specification # sec-class-definitions |
| ECMAScript Language Specification # sec-comma-operator |
| ECMAScript Language Specification # sec-conditional-operator |
| ECMAScript Language Specification # sec-postfix-decrement-operator |
| ECMAScript Language Specification # sec-delete-operator |
| ECMAScript Language Specification # sec-destructuring-assignment |
| ECMAScript Language Specification # sec-destructuring-binding-patterns |
| ECMAScript Language Specification # sec-multiplicative-operators |
| ECMAScript Language Specification # sec-equality-operators |
| ECMAScript Language Specification # sec-exp-operator |
| ECMAScript Language Specification # sec-function-definitions |
| ECMAScript Language Specification # sec-generator-function-definitions |
| ECMAScript Language Specification # sec-relational-operators |
| ECMAScript Language Specification # sec-grouping-operator |
| ECMAScript Language Specification # sec-import-calls |
| ECMAScript Language Specification # prod-ImportMeta |
| HTML Standard # hostgetimportmetaproperties |
| ECMAScript Language Specification # sec-postfix-increment-operator |
| ECMAScript Language Specification # sec-left-shift-operator |
| ECMAScript Language Specification # prod-LogicalANDExpression |
| ECMAScript Language Specification # sec-logical-not-operator |
| ECMAScript Language Specification # prod-LogicalORExpression |
| ECMAScript Language Specification # sec-new-operator |
| ECMAScript Language Specification # sec-built-in-function-objects |
| ECMAScript Language Specification # sec-null-value |
| ECMAScript Language Specification # prod-CoalesceExpression |
| ECMAScript Language Specification # sec-object-initializer |
| ECMAScript Language Specification # prod-OptionalExpression |
| ECMAScript Language Specification # sec-property-accessors |
| ECMAScript Language Specification # sec-signed-right-shift-operator |
| ECMAScript Language Specification # prod-SpreadElement |
| ECMAScript Language Specification # prod-ArgumentList |
| ECMAScript Language Specification # prod-PropertyDefinition |
| ECMAScript Language Specification # sec-subtraction-operator-minus |
| ECMAScript Language Specification # sec-super-keyword |
| ECMAScript Language Specification # sec-this-keyword |
| ECMAScript Language Specification # sec-typeof-operator |
| ECMAScript Language Specification # sec-unary-minus-operator |
| ECMAScript Language Specification # sec-unary-plus-operator |
| ECMAScript Language Specification # sec-unsigned-right-shift-operator |
| ECMAScript Language Specification # sec-void-operator |
| ECMAScript Language Specification # prod-YieldExpression |
| ECMAScript Language Specification # sec-generator-function-definitions-runtime-semantics-evaluation |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* 运算符优先级