运算符优先级

js/operator_precedence2026-08-24 19:46:25

运算符的优先级 决定了表达式中运算执行的先后顺序。优先级高的运算符会作为优先级低的运算符的操作数。

优先级

不同运算的优先级决定了运算顺序。

考虑由下面的表示法描述的表达式。其中,OP1 和 OP2 都是操作符的占位符。

a OP1 b OP2 c

如果 OP1 和 OP2 具有不同的优先级,则优先级最高的运算符先执行,执行完后的结果作为优先级低的运算符的操作数。

结合性

当有多个具有相同优先级的运算符时,结合性 的差异就会发挥作用。

考虑由下面的表示法描述的表达式。其中,OP 是操作符的占位符。

a OP b OP c

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

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

a = b = 5; // 相当于 a = (b = 5);

只有幂运算符是右结合的,而其他算术运算符都是左结合的。

求值顺序

无论结合性和优先级如何,操作数的求值顺序总是从左到右。

function getValue(value) {
  console.log(value);
  return value;
}

let result = getValue(1) + getValue(2) * getValue(3);

输出顺序将是:

1
2
3

所有运算符的优先级顺序

优先级 运算符类型 结合性 运算符
19 分组 无法结合 ( … )
18 成员访问 从左到右 … . …
需计算的成员访问 从左到右 … [ … ]
new(带参数列表) 无法结合 new … ( … )
函数调用 从左到右 … ( … )
可选链(Optional chaining) 从左到右 ?.
17 new(无参数列表) 从右到左 new …
16 后置递增 无法结合 … ++
后置递减 … --
15 逻辑非 (!) 从右到左 ! …
按位非 (~) ~ …
一元加法 (+) + …
一元减法 (-) - …
前置递增 ++ …
前置递减 -- …
typeof typeof …
void void …
delete delete …
await await …
14 幂 (**) 从右到左 … ** …
13 乘法 (*) 从左到右 … * …
除法 (/) … / …
取余 (%) … % …
12 加法 (+) 从左到右 … + …
减法 (-) … - …
11 按位左移 (<<) 从左到右 … << …
按位右移 (>>) … >> …
无符号右移 (>>>) … >>> …
10 小于 (<) 从左到右 … < …
小于等于 (<=) … <= …
大于 (>) … > …
大于等于 (>=) … >= …
in … in …
instanceof … instanceof …
9 相等 (==) 从左到右 … == …
不相等 (!=) … != …
一致/严格相等 (===) … === …
不一致/严格不相等 (!==) … !== …
8 按位与 (&) 从左到右 … & …
7 按位异或 (^) 从左到右 … ^ …
6 按位或 (|) 从左到右 … | …
5 逻辑与 (&&) 从左到右 … && …
4 逻辑或 (||) 从左到右 … || …
空值合并 (??) 从左到右 … ?? …
3 条件(三元)运算符 从右到左 … ? … : …
2 赋值 从右到左 … = …
… += …
… -= …
… **= …
… *= …
… /= …
… %= …
… <<= …
… >>= …
… >>>= …
… &= …
… ^= …
… |= …
… &&= …
… ||= …
… ??= …
1 逗号 / 序列 从左到右 … , …

参考

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_precedence

本页目录