運算式與運算子
=======

本章節記錄了所有 JavaScript 運算式、運算子以及關鍵字。

運算式與運算子分類
---------

以字母排列的清單請參考左側的側邊欄。

### 主要運算式

在 JavaScript 中基本的關鍵字與一般的運算式。

`this`

`this` 關鍵字可以參考執行函數的所在位置。

`function` (en-US)

`function` 關鍵字可以定義一個函數運算式。

`class` (en-US)

`class` 關鍵字可以定義一個類別運算式。

`function*` (en-US)

`function*` 關鍵字可以定義一個 Generator 函數運算式

`yield` (en-US)

暫停與繼續一個產生器 (Generator) 函數。

`yield*` (en-US)

轉交另一個產生器 (Generator) 函數或可迭代 (Iterable) 的物件。

實驗性質 `async function*` (en-US)

`async` 函數可以定義一個非同步函數運算式。

實驗性質 `await`

暫停與繼續一個非同步函數並等候承諾的結果/拒絕。

`[]`

陣列初始化/書寫格式。

`{}` (en-US)

物件初始化/書寫格式。

`/ab+c/i` (en-US)

正規表示法書寫格式。

`( )` (en-US)

分組運算子。

### 左手邊運算式

左側值為賦值的目標。

Property accessors (en-US)

 成員運算子可存取物件的屬性或方法
 (`object.property` and `object["property"]`)。


`new`

`new` 運算子可以建立一個建構子 (Constructor) 的實例。

new.target (en-US)

在建構子中 `new.target` 可以參考被 `new` 呼叫的建構子 (Constructor) 。

`super`

`super` 關鍵字可以呼叫父建構子 (Constructor) 。

`...obj` (en-US)

The spread operator allows an expression to be expanded in places where multiple arguments (for function calls) or multiple elements (for array literals) are expected.

### 遞增與遞減

字尾/字首遞增與字尾/字首遞減運算子。

`A++` (en-US)

字尾遞增運算子。

`A--` (en-US)

字尾遞減運算子。

`++A` (en-US)

字首遞增運算子。

`--A` (en-US)

字首遞減運算子。

### 一元運算子

一元運算是指只需要使用一個運算元的運算。

`delete`

`delete` 運算子可刪除物件中的屬性。

`void` (en-US)

`void` 運算子可放棄一個運算式的回傳值。

`typeof`

`typeof` 運算子可以判斷一個指定物件的型態。

`+` (en-US)

一元正運算子可以轉換其運算元成為數值 (Number) 型態。

`-` (en-US)

一元負運算子可以轉換其運算元成為數值 (Number) 型態並轉為負值。

`~` (en-US)

元位 NOT 運算子。

`!` (en-US)

邏輯 NOT 運算子。

### 算術運算子

算術運算子會要用到數值 (不論是字面值或者變數) 做為運算元，並且會回傳單一數值結果。

`+` (en-US)

加法運算子。

`-` (en-US)

減法運算子。

`/` (en-US)

除法運算子。

`*` (en-US)

乘法運算子。

`%` (en-US)

餘數運算子。

`**` (en-US)

指數運算子。

### 關係運算子

比較運算子會比較其運算元並根據比較的結果是否成立回傳一個 `Boolean` 值的結果。

`in` (en-US)

`in` 運算子會判斷一個物件是否有指定的屬性。

`instanceof` (en-US)

`instanceof` 運算子會判斷一個物件是否為另一個物件的實例。

`<` (en-US)

小於運算子。

`>` (en-US)

大於運算子。

`<=` (en-US)

小於等於運算子。

`>=` (en-US)

大於等於運算子。


**備註：** => is not an operator, but the notation for Arrow functions.

### 相等運算子

執行相對運算子後的結果為比較結果是否成立的 `Boolean` 值。

`==` (en-US)

相等運算子。

`!=` (en-US)

不相等運算子。

`===` (en-US)

恆等運算子。

`!==` (en-US)

不恆等運算子。

### 位元移位運算子

用來位移運算元所有位元的運算。

`<<` (en-US)

左移位元運算子。

`>>` (en-US)

右移位元運算子。

`>>>` (en-US)

右移無號位元運算子。

### 二元位元運算子

位元運算子將其運算元當做是 32 位元 (32 個零與一) 的數值處理並回傳標準 JavaScript 數值。

`&` (en-US)

位元 AND。

`|` (en-US)

位元 OR。

`^` (en-US)

位元 XOR。

### 二元邏輯運算子

邏輯運算子一般用在處理布林 (邏輯) 值，它們存在的地方會回傳一個布林 (Boolean) 值。

`&&` (en-US)

邏輯 AND。

`||` (en-US)

邏輯 OR。

### 條件 (三元) 運算子

`(condition ? ifTrue : ifFalse)`

條件運算子會根據條件的邏輯值判斷並回傳其中一個值。

### 賦值運算子

賦值運算子會根據其右側運算元的數值處理後賦值給其左側的運算元。

`=` (en-US)

賦值運算子。

`*=` (en-US)

乘法賦值。

`/=` (en-US)

除法賦值。

`%=` (en-US)

餘數賦值。

`+=` (en-US)

加法賦值。

`-=` (en-US)

減法賦值。

`<<=` (en-US)

左移賦值。

`>>=` (en-US)

右移賦值。

`>>>=` (en-US)

無號右移賦值。

`&=` (en-US)

位元 AND 賦值。

`^=` (en-US)

位元 XOR 賦值。

`|=` (en-US)

位元 OR 賦值。

`[a, b] = [1, 2]`
`{a, b} = {a:1, b:2}`

解構賦值讓你可使用如陣列或物件書寫格式來賦值給陣列或物件的屬性。

### 逗號運算子

`,` (en-US)

逗號運算子允許在一個敘述句中執行多個運算式並回傳最後一個運算式的結果。

### 非標準功能

非標準 Legacy generator function (en-US)

The `function` keyword can be used to define a legacy generator function inside an expression. To make the function a legacy generator, the function body should contains at least one `yield` (en-US) expression.

非標準 Expression closures

The expression closure syntax is a shorthand for writing simple function.

非標準 `[for (x of y) x]` (en-US)

Array comprehensions.

非標準 `(for (x of y) y)` (en-US)

Generator comprehensions.

技術規格
----

| 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 |

相關文獻
----

* Operator precedence