运算符优先级

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

结合性

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

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/Anew Foo(bar)
函数调用从左到右foo()
18实例化对象(无参数列表)从左到右new Foo
17更新表达式(后置递增)N/Afoo++
更新表达式(后置递减)N/Afoo--
16逻辑运算符(逻辑非)从右到左!foo
按位非~foo
一元加法+foo
一元减法-foo
更新表达式(前置递增)++foo
更新表达式(前置递减)--foo
typeoftypeof foo
voidvoid foo
deletedelete foo
awaitawait 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
infoo in bar
instanceoffoo instance bar
10等号从左到右foo == bar
非等号foo !== bar
全等号foo === bar
非全等号foo !== bar
9按位与从左到右foo & bar
8按位异或从左到右foo ^ bar
7按位或从左到右foo | bar
6逻辑运算符(逻辑与)从左到右foo && bar
5逻辑运算符(逻辑或)从左到右foo || bar
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
赋值运算符 foo |= bar
2yield从右到左yield foo
yield*yield* foo
1扩展运算符N/A...foo
0逗号运算符从左到右foo, bar