JavaScript运算符优先级
运算符优先级
运算符从上到下共分为20个等级,由上到下优先级逐渐降低,见下文。
-
20 () 括号优先级最高 多个括号无关联,一个一个算
-
19 变量或函数的属性调用和访问 优先级仅次于括号 多个出现从左到右计算
例如: a.x的. a[b]的[] new foo(有参数) 函数调用 fn()
-
18 new (无参数)
-
17 后置递增和后置递减 a++ a-- 优先级高于前置 多个出现时无关联,一个一个算
-
16 一元运算符 优先级也比较高 从右向左计算,先算右边变量再算左边运算符
例如: +a -a (一元加减) 逻辑非! 按位非~ ++a --a(前置加减) typeof void delete await
-
15 幂运算 …**… 从右到左计算
-
14 乘除取模 * / % 优先级高于普通的运算符 从左到右计算
-
13 加法减法 + - 从左到右计算
-
12 位运算符 例如 按位左移 …<<… 按为右移 …>>… 无符号右移…>>>…
-
11 比较运算符 比较运算符优先级仅高于判断的运算符 从左到右计算
例如: < > <= >= in instanceof
-
10 判断运算符 注意是两等和三等而不是等于号 从左到右计算
例如: == != === !==
-
9 按为运算符 按为与 & 从左到右计算
-
8 按为运算符 按为异或 ^ 从左到右计算
-
7 按为运算符 按为或 | 从左到右计算
-
6 逻辑与 && **优先级高于逻辑或 ** 从左到右计算
-
5 逻辑或 || 高于三目运算 从左到右计算
-
4 条件运算符 … ? … :… 优先级仅高于赋值运算符 从右向左计算
-
3 各种赋值运算符 赋值运算符最低,仅高于逗号 从右向左计算
例如: = += -= *= /= %= &= |= ^=
-
2 yield 从右向左计算
-
1 展开运算符 … … 很低 无关联
-
0 逗号运算符…,… 运算优先级最低,没有之一 从左到右计算
常用运算符优先级
() >> ( . [ ] ) > > (后置递增递减a++,a-- ) >> (一元加减±,非!,前置±) >> (*/%) >> (±运算符) >>
(> < >= <= in instanceof) >> (== === != !==) >> (&&) >> (||) >> (三目) >> (赋值运算符) >> (逗号运算符,)
案例
-
加减运算符的优先级要高于赋值符号 例如 + 要高于 +=
<script> var a = 3 console.log(a += 2 + "px") // 32px 这里先算 2 + "px" , 再算 3 += "2px" 得到32px </script>>
-
. [ ]的运算符非常高,计算时候要注意
<script> var a = {n:1}; var b = a; a.x = a ={m:2}; // 这里先算 . 运算符,.后没有直接结果先挂起来,再算a.x后面的 // 后面的两个赋值号,从右向左计算,先将{m:2} 赋值给一个变量a // 最后计算完毕在将{m:2} 赋值给 a.x console.log(a); // {m: 2} console.log(b) // {n: 1, x: {m:2}} </script>
-
同样是加号,后置++优先级 > 一元加减运算符(等同于前置++优先级) > 加减法(+ -),先算后置加加,再算前置加加或者一元运算符,最后算加减法。