首页 > 代码库 > 运算符的优先级

运算符的优先级

写代码的时候经常会有不知道哪个运算符优先级更高,我就加一个括号,时间久了觉得这种方式不好,所以还是仔细总结一下,争取做一个严谨的程序媛。

以下是从高到低:

优先级运算类型关联性运算符
19圆括号n/a( … )
18成员访问从左到右… . …
需计算的成员访问从左到右… [ … ]
new (带参数列表)n/anew … ( … )
17函数调用从左到右… ( … )
new (无参数列表)从右到左new …
16后置递增(运算符在后)n/a… ++
后置递减(运算符在后)n/a… --
15逻辑非从右到左! …
按位非从右到左~ …
一元加法从右到左+ …
一元减法从右到左- …
前置递增从右到左++ …
前置递减从右到左-- …
typeof从右到左typeof …
void从右到左void …
delete从右到左delete …
14乘法从左到右… * …
除法从左到右… / …
取模从左到右… % …
13加法从左到右… + …
减法从左到右… - …
12按位左移从左到右… << …
按位右移从左到右… >> …
无符号右移从左到右… >>> …
11小于从左到右… < …
小于等于从左到右… <= …
大于从左到右… > …
大于等于从左到右… >= …
in从左到右… in …
instanceof从左到右… instanceof …
10等号从左到右… == …
非等号从左到右… != …
全等号从左到右… === …
非全等号从左到右… !== …
9按位与从左到右… & …
8按位异或从左到右… ^ …
7按位或从左到右… | …
6逻辑与从左到右… && …
5逻辑或从左到右… || …
4条件运算符从右到左… ? … : …
3赋值从右到左… = …
… += …
… -= …
… *= …
… /= …
… %= …
… <<= …
… >>= …
… >>>= …
… &= …
… ^= …
… |= …
2yield从右到左yield …
yield*从右到左yield* …
1Spreadn/a... …
0逗号从左到右… , …

下面举几个栗子:

new Foo.getName();  //按照第18个里面的其实就是new (Foo.getName())
new Foo().getName();
//按照第18个里面的其实就是(new Foo()).getName()这里成员访问的优先级是最高的,因此先执行了 .getName,

//但是在进行左侧取值的时候, new Foo() 可以理解为两种运算:new 带参数(即 new Foo())和函数调用(即 先 Foo() 取值之后再 new),
//而 new 带参数的优先级是高于函数调用的,因此先执行了 new Foo(),或得 Foo 类的实例对象,再进行了成员访问 .getName。
new new Foo().getName();//按照第18个里面的其实就是new((new Foo()).getName())

  

运算符的优先级