运算符优先级

运算符的优先级决定了表达式中运算执行的先后顺序,优先级高的运算符最先被执行。

结合性

结合性决定了拥有相同优先级的运算符的执行顺序。考虑下面这个表达式:

a OP b OP c
  • 左结合(左到右)相当于把左边的子表达式加上小括号 (a OP b) OP c

  • 右关联(右到左)相当于 a OP (b OP c)

赋值运算符是右关联的,所以你可以这么写:

a = b = 5;

结果:a  和  b  的值都会成为 5。这是因为赋值运算符的返回结果就是赋值运算符右边的那个值,具体过程是:b 被赋值为 5,然后 a 也被赋值为  b=5  的返回值,也就是 5。

汇总表

以下示例中使用 foobar 作为演示变量或表达式。

优先级 运算类型 关联性 运算符示例
20 分组表达式 N/A (foo)
19 属性访问器 从左到右 foo.bar
属性访问器 从左到右 foo[bar]
实例化对象(带参数列表) N/A new Foo(bar)
函数调用 从左到右 foo()
18 实例化对象(无参数列表) 从左到右 new Foo
17 更新表达式(后置递增) N/A foo++
更新表达式(后置递减) N/A foo--
16 逻辑运算符(逻辑非) 从右到左 !foo
按位非 ~foo
一元加法 +foo
一元减法 -foo
更新表达式(前置递增) ++foo
更新表达式(前置递减) --foo
typeof typeof foo
void void foo
delete delete foo
await await foo
15 算术运算符(幂) 从右到左 foo ** bar
14 算术运算符(乘法) 从左到右 foo * bar
算术运算符(除法) foo / bar
算术运算符(取模) foo % bar
13 算术运算符(加法) 从左到右 foo + bar
算术运算符(减法) foo - bar
12 按位左移 从左到右 foo << bar
按位右移 foo >> bar
无符号右移 ... >>> bar
11 小于 从左到右 foo < bar
小于等于 foo <= bar
大于 foo > bar
大于等于 foo >= bar
in foo in bar
instanceof foo instance bar
10 等号 从左到右 foo == bar
非等号 foo !== bar
全等号 foo === bar
非全等号 foo !== bar
9 按位与 从左到右 foo & bar
8 按位异或 从左到右 foo ^ bar
7 按位或 从左到右 <code>foo | bar</code>
6 逻辑运算符(逻辑与) 从左到右 foo && bar
5 逻辑运算符(逻辑或) 从左到右 <code>foo || bar</code>
4 条件运算符 从右到左 foo ? foo : bar
3 赋值运算符 从右到左 foo = bar
赋值运算符 foo += bar
赋值运算符 foo -= bar
赋值运算符 foo *= bar
赋值运算符 foo /= bar
赋值运算符 foo %= bar
赋值运算符 foo <<= bar
赋值运算符 foo >>= bar
赋值运算符 foo >>>= bar
赋值运算符 foo &= bar
赋值运算符 foo ^= bar
赋值运算符 <code> foo |= bar</code>
2 yield 从右到左 yield foo
yield* yield* foo
1 扩展运算符 N/A ...foo
0 逗号运算符 从左到右 foo, bar