> For the complete documentation index, see [llms.txt](https://lochiwei.gitbook.io/web/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lochiwei.gitbook.io/web/js/grammar/op/table-of-operators.md).

# table of operators

🚧 under construction -> fix table precedence

[JS](/web/js.md) ⟩ [statement](/web/js/grammar/statement.md) ⟩ [expression](/web/js/grammar/statement/expr.md) ⟩ [operator](/web/js/grammar/op.md) ⟩ table of operators

{% tabs %}
{% tab title="⭐️ 重點" %}
{% hint style="info" %}
[**property access**](/web/js/val/obj/prop/access/property-access-expression.md) and [**invocation**](/web/js/grammar/statement/expr/invoke.md) expressions have <mark style="color:red;">**higher**</mark>**&#x20;**<mark style="color:yellow;">**precedence**</mark> <mark style="color:yellow;">**than**</mark> <mark style="color:red;">**any**</mark> of the <mark style="color:purple;">**operators**</mark>.
{% endhint %}
{% endtab %}

{% tab title="👥 相關" %}

* [short-circuiting](/web/js/grammar/op/term/short-circuiting.md)
  {% endtab %}

{% tab title="📗 參考" %}

* [ ] [JavaScript: The Definitive Guide](/web/master/ref/javascript-the-definitive-guide.md) ⟩ 4.7 Operator Overview
  {% endtab %}

{% tab title="📘 手冊" %}

* [Operator precedence](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence) ⟩&#x20;
  * [operator precedence table ⭐️ ](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#table)
  * [short-circuiting](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#short-circuiting)&#x20;
* [Expressions and operators](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators)
  {% endtab %}

{% tab title="❓" %}
{% hint style="warning" %} <mark style="color:red;">**問：**</mark>「 Why <mark style="color:blue;">**`a && b`**</mark> is (any, any) -> <mark style="color:red;">**any**</mark> 」❓

<mark style="color:green;">答：</mark>「 because it <mark style="color:yellow;">**returns**</mark>**&#x20;**<mark style="color:blue;">**a**</mark> if <mark style="color:blue;">**a**</mark> is [**falsy**](/web/js/val/type/falsy.md), otherwise returns <mark style="color:blue;">**b**</mark>. 」
{% endhint %}
{% endtab %}
{% endtabs %}

{% hint style="success" %}

* <mark style="color:red;">**P**</mark>：<mark style="color:red;">**precedence**</mark>,   <mark style="color:yellow;">**A**</mark>：<mark style="color:yellow;">**association**</mark>,   <mark style="color:green;">**N**</mark>：<mark style="color:green;">**number of operands**</mark> (arity)
* <mark style="color:blue;">**lval**</mark>：[lvalue](/web/js/grammar/op/term/lvalue.md), n：[num](/web/js/val/prim/num.md), s：str, i：int, o：obj, f：func, b：bool, <mark style="color:red;">**a**</mark>：<mark style="color:red;">**any**</mark>
  {% endhint %}

<table><thead><tr><th width="76" data-type="number">P</th><th width="123">Operator</th><th width="265">Operation</th><th width="78">A<select><option value="4d3130aa22c342978df41d7124fe9c31" label="R" color="blue"></option><option value="fcb74ebed1c14940aef92e6a2aeab8fd" label="L" color="blue"></option><option value="387ca1ae753e4fc3af85896e6944a0b4" label="🈚" color="blue"></option></select></th><th width="78" data-type="number">N</th><th>Types</th></tr></thead><tbody><tr><td>18</td><td>( ... )</td><td><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Grouping">Grouping</a></td><td><span data-option="387ca1ae753e4fc3af85896e6944a0b4">🈚</span></td><td>null</td><td></td></tr><tr><td>17</td><td>obj . prop</td><td><a href="/web/js/val/obj/prop/access/dot-notation-..md">property access</a></td><td><span data-option="fcb74ebed1c14940aef92e6a2aeab8fd">L</span></td><td>null</td><td></td></tr><tr><td>null</td><td>obj [ prop ]</td><td><a href="/web/js/val/obj/prop/access/bracket-notation.md">computed property access</a></td><td><span data-option="387ca1ae753e4fc3af85896e6944a0b4">🈚</span></td><td>null</td><td></td></tr><tr><td>null</td><td><a href="/web/js/val/obj/create/new.md">new F(args)</a></td><td><mark style="color:green;"><strong>with</strong></mark> argument list</td><td><span data-option="387ca1ae753e4fc3af85896e6944a0b4">🈚</span></td><td>null</td><td></td></tr><tr><td>null</td><td>f ( args )</td><td><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions">Function Call</a></td><td><span data-option="387ca1ae753e4fc3af85896e6944a0b4">🈚</span></td><td>null</td><td></td></tr><tr><td>null</td><td>obj ?. prop</td><td><a href="/web/js/val/obj/prop/access/optional-chaining.md">optional chaining</a></td><td><span data-option="fcb74ebed1c14940aef92e6a2aeab8fd">L</span></td><td>null</td><td></td></tr><tr><td>16</td><td><a href="/web/js/val/obj/create/new.md">new F()</a></td><td><mark style="color:red;"><strong>without</strong></mark> argument list</td><td><span data-option="387ca1ae753e4fc3af85896e6944a0b4">🈚</span></td><td>null</td><td></td></tr><tr><td>15</td><td>++</td><td>post-increment</td><td><span data-option="387ca1ae753e4fc3af85896e6944a0b4">🈚</span></td><td>null</td><td></td></tr><tr><td>null</td><td>--</td><td>post-decrement</td><td><span data-option="387ca1ae753e4fc3af85896e6944a0b4">🈚</span></td><td>null</td><td></td></tr><tr><td>14</td><td><mark style="color:purple;"><strong><code>!</code></strong></mark></td><td><a href="/web/js/grammar/op/logical.md">logical</a> not</td><td><span data-option="387ca1ae753e4fc3af85896e6944a0b4">🈚</span></td><td>1</td><td>bool -> bool</td></tr><tr><td>0</td><td><a href="/web/js/grammar/op/arithmetic/bitwise/not.md"><mark style="color:purple;"><strong><code>~</code></strong></mark></a></td><td>bitwise not (<a href="/web/js/grammar/op/arithmetic/bitwise/not.md">invert bits</a>) </td><td><span data-option="387ca1ae753e4fc3af85896e6944a0b4">🈚</span></td><td>1</td><td>int -> int</td></tr><tr><td>0</td><td><a href="/web/js/grammar/op/arithmetic/unary/+.md"><mark style="color:purple;"><strong><code>+</code></strong></mark></a></td><td>unary + (<a href="/web/js/grammar/op/arithmetic/unary.md">convert</a> to number)</td><td><span data-option="387ca1ae753e4fc3af85896e6944a0b4">🈚</span></td><td>1</td><td><mark style="color:red;"><strong>any</strong></mark> -> num</td></tr><tr><td>0</td><td>-</td><td>unary - (negative)</td><td><span data-option="387ca1ae753e4fc3af85896e6944a0b4">🈚</span></td><td>1</td><td>num -> num</td></tr><tr><td>0</td><td>++</td><td>pre-increment</td><td><span data-option="387ca1ae753e4fc3af85896e6944a0b4">🈚</span></td><td>1</td><td><a href="/web/js/grammar/op/term/lvalue.md"><strong>lval</strong></a> -> num</td></tr><tr><td>0</td><td>--</td><td>pre-decrement</td><td><span data-option="387ca1ae753e4fc3af85896e6944a0b4">🈚</span></td><td>1</td><td><a href="/web/js/grammar/op/term/lvalue.md"><strong>lval</strong></a> -> num</td></tr><tr><td>0</td><td><a href="/web/js/val/type/name/typeof.md">typeof</a></td><td><a href="/web/js/val/type.md">type</a> of operand</td><td><span data-option="387ca1ae753e4fc3af85896e6944a0b4">🈚</span></td><td>1</td><td><mark style="color:red;"><strong>any</strong></mark> -> str</td></tr><tr><td>0</td><td><a href="/web/js/val/obj/prop/create/delete.md">delete</a></td><td><a href="/web/js/val/obj/prop/create/delete.md">delete</a> a property</td><td><span data-option="387ca1ae753e4fc3af85896e6944a0b4">🈚</span></td><td>1</td><td><a href="/web/js/grammar/op/term/lvalue.md"><strong>lval</strong></a> -> bool</td></tr><tr><td>0</td><td><a href="/web/js/grammar/op/unary/void.md">void</a></td><td>return <a href="/web/js/val/prim/undefined.md">undefined</a></td><td><span data-option="387ca1ae753e4fc3af85896e6944a0b4">🈚</span></td><td>1</td><td><mark style="color:red;"><strong>any</strong></mark> -> undef</td></tr><tr><td>null</td><td><a href="/web/js/async/await.md">await</a></td><td></td><td><span data-option="387ca1ae753e4fc3af85896e6944a0b4">🈚</span></td><td>null</td><td></td></tr><tr><td>13</td><td><a href="/web/js/grammar/op/arithmetic/binary/exp.md"><mark style="color:blue;"><strong><code>**</code></strong></mark></a></td><td><a href="/web/js/grammar/op/arithmetic/binary/exp.md">exponentiation</a></td><td><span data-option="4d3130aa22c342978df41d7124fe9c31">R</span></td><td>2</td><td>(n, n) -> n</td></tr><tr><td>null</td><td>*, /, <a href="/web/js/grammar/op/arithmetic/binary/remainder.md"><mark style="color:blue;"><strong><code>%</code></strong></mark></a></td><td>multiply, divide, <a href="/web/js/grammar/op/arithmetic/binary/remainder.md">remainder</a></td><td><span data-option="fcb74ebed1c14940aef92e6a2aeab8fd">L</span></td><td>2</td><td>(n, n) -> n</td></tr><tr><td>0</td><td><a href="/web/js/grammar/op/arithmetic/binary/+.md"><mark style="color:blue;"><strong><code>+</code></strong></mark></a>, -</td><td><a href="/web/js/grammar/op/arithmetic/binary/+.md">add</a>, substract</td><td><span data-option="fcb74ebed1c14940aef92e6a2aeab8fd">L</span></td><td>2</td><td>(n, n) -> n</td></tr><tr><td>0</td><td><a href="/web/js/grammar/op/arithmetic/binary/+.md"><mark style="color:blue;"><strong><code>+</code></strong></mark></a></td><td><a href="/web/js/grammar/op/arithmetic/binary/+.md">concatenate</a> strings</td><td><span data-option="fcb74ebed1c14940aef92e6a2aeab8fd">L</span></td><td>2</td><td>(s, s) -> s</td></tr><tr><td>0</td><td>&#x3C;&#x3C;</td><td>shift left</td><td><span data-option="fcb74ebed1c14940aef92e6a2aeab8fd">L</span></td><td>2</td><td>(i, i) -> i</td></tr><tr><td>0</td><td>>></td><td>shift right (sign extension)</td><td><span data-option="fcb74ebed1c14940aef92e6a2aeab8fd">L</span></td><td>2</td><td>(i, i) -> i</td></tr><tr><td>0</td><td>>>></td><td>shift right (0 extension)</td><td><span data-option="fcb74ebed1c14940aef92e6a2aeab8fd">L</span></td><td>2</td><td>(i, i) -> i</td></tr><tr><td>0</td><td>&#x3C; &#x3C;= > >=</td><td><a href="/web/js/grammar/op/relational/compare.md">compare</a> (number)</td><td><span data-option="fcb74ebed1c14940aef92e6a2aeab8fd">L</span></td><td>2</td><td>(n, n) -> b</td></tr><tr><td>0</td><td>&#x3C; &#x3C;= > >=</td><td><a href="/web/js/grammar/op/relational/compare.md">compare</a> (string)</td><td><span data-option="fcb74ebed1c14940aef92e6a2aeab8fd">L</span></td><td>2</td><td>(s, s) -> b</td></tr><tr><td>0</td><td><a href="/web/js/grammar/op/relational/instanceof.md">instanceof</a></td><td>test object class</td><td><span data-option="fcb74ebed1c14940aef92e6a2aeab8fd">L</span></td><td>2</td><td>(o, f) -> b</td></tr><tr><td>0</td><td><a href="/web/js/grammar/op/relational/in.md">in</a></td><td>test property existence</td><td><span data-option="fcb74ebed1c14940aef92e6a2aeab8fd">L</span></td><td>2</td><td>(a, o) -> b</td></tr><tr><td>0</td><td><a href="/web/js/grammar/op/relational/equal/sloppy-equality.md"><mark style="color:blue;"><strong><code>==</code></strong></mark></a></td><td><a href="/web/js/grammar/op/relational/equal/sloppy-equality.md">equal (sloppy)</a></td><td><span data-option="fcb74ebed1c14940aef92e6a2aeab8fd">L</span></td><td>2</td><td>(a, a) -> b</td></tr><tr><td>0</td><td>!=</td><td>not equal (sloppy)</td><td><span data-option="fcb74ebed1c14940aef92e6a2aeab8fd">L</span></td><td>2</td><td>(a, a) -> b</td></tr><tr><td>0</td><td><a href="/web/js/grammar/op/relational/equal/strict-equality.md"><mark style="color:blue;"><strong><code>===</code></strong></mark></a></td><td><a href="/web/js/grammar/op/relational/equal/strict-equality.md">equal (strict)</a></td><td><span data-option="fcb74ebed1c14940aef92e6a2aeab8fd">L</span></td><td>2</td><td>(a, a) -> b</td></tr><tr><td>0</td><td>!==</td><td>not equal (strict)</td><td><span data-option="fcb74ebed1c14940aef92e6a2aeab8fd">L</span></td><td>2</td><td>(a, a) -> b</td></tr><tr><td>0</td><td>&#x26;</td><td>bitwise AND</td><td><span data-option="fcb74ebed1c14940aef92e6a2aeab8fd">L</span></td><td>2</td><td>(i, i) -> i</td></tr><tr><td>0</td><td>^</td><td>bitwise XOR</td><td><span data-option="fcb74ebed1c14940aef92e6a2aeab8fd">L</span></td><td>2</td><td>(i, i) -> i</td></tr><tr><td>0</td><td>|</td><td>bitwise OR</td><td><span data-option="fcb74ebed1c14940aef92e6a2aeab8fd">L</span></td><td>2</td><td>(i, i) -> i</td></tr><tr><td>0</td><td>&#x26;&#x26;</td><td><a href="/web/js/grammar/op/logical.md">logical</a> AND</td><td><span data-option="fcb74ebed1c14940aef92e6a2aeab8fd">L</span></td><td>2</td><td>(a, a) -> <mark style="color:red;"><strong>a</strong></mark></td></tr><tr><td>0</td><td>||</td><td><a href="/web/js/grammar/op/logical.md">logical</a> OR</td><td><span data-option="fcb74ebed1c14940aef92e6a2aeab8fd">L</span></td><td>2</td><td>(a, a) -> <mark style="color:red;"><strong>a</strong></mark></td></tr><tr><td>0</td><td><a href="/web/js/grammar/op/logical/nullish-coalescing.md"><mark style="color:blue;"><strong><code>??</code></strong></mark></a></td><td><a href="/web/js/grammar/op/logical/nullish-coalescing.md">nullish coalescing</a></td><td><span data-option="fcb74ebed1c14940aef92e6a2aeab8fd">L</span></td><td>2</td><td>(a, a) -> <mark style="color:red;"><strong>a</strong></mark></td></tr><tr><td>0</td><td><a href="/web/js/grammar/op/ternary/conditional-operator.md"><mark style="color:blue;"><strong><code>?:</code></strong></mark></a></td><td><a href="/web/js/grammar/op/ternary.md">ternary operator</a></td><td><span data-option="4d3130aa22c342978df41d7124fe9c31">R</span></td><td>3</td><td>(b, a, a) -> a</td></tr><tr><td>0</td><td><a href="/web/js/grammar/op/assign/assignment.md"><mark style="color:blue;"><strong><code>=</code></strong></mark></a></td><td><a href="/web/js/grammar/op/assign/assignment.md">assignment</a></td><td><span data-option="4d3130aa22c342978df41d7124fe9c31">R</span></td><td>2</td><td>(<a href="/web/js/grammar/op/term/lvalue.md"><strong>lval</strong></a>, a) -> a</td></tr><tr><td>0</td><td>**= *= /= %= += -= &#x26;= ^= |= &#x3C;&#x3C;= >>= >>>=</td><td>operate/assign</td><td><span data-option="4d3130aa22c342978df41d7124fe9c31">R</span></td><td>2</td><td>(<a href="/web/js/grammar/op/term/lvalue.md"><strong>lval</strong></a>, a) -> a</td></tr><tr><td>0</td><td><a href="/web/js/grammar/op/binary/comma-operator.md"><mark style="color:blue;"><strong><code>,</code></strong></mark></a></td><td><a href="/web/js/grammar/op/binary/comma-operator.md">return 2nd operand</a></td><td><span data-option="fcb74ebed1c14940aef92e6a2aeab8fd">L</span></td><td>2</td><td>(a, a) -> a</td></tr></tbody></table>
