JavaScript运算符优先级与结合性

优先级与结合性

优先级和结合性会决定表达式中的运算如何结合,也就是指结合的优先级(通俗一点,可以理解为 优先级高的运算符会用个括号括起来),例如:
var value1 = 1 + 0 ? 2 : 3;
var value2 = ( 1 + 0 ) ? 2 : 3;
var value3 = 1 + ( 0 ? 2 : 3 );
console.log(value1);//2
console.log(value2);//2
console.log(value3);//4
因为+的优先性高于:?,所以value1等价于value2。
再例如:
var value1 = 1 ? 1 : 0 ? 4 : 5;
var value2 = 1 ? 1 : ( 0 ? 4 : 5 );
var value3 = ( 1 ? 1 : 0 ) ? 4 : 5;

console.log(value1);//1
console.log(value2);//1
console.log(value3);//4
...?...:... 是右结合的,因此value1与value2是等价的(如果...?...:... 是左结合,那么value1应该等于value3)。
此外对于value1和value2而言,0?4:5是没有执行的,将上面的代码改下:
function getValue(v){
    console.log("get ",v);
    return v;
}

var value1 = 1 ? 1 : 0 ? 4 : getValue(5);
var value2 = 1 ? 1 : ( 0 ? 4 : getValue(5) );
var value3 = ( 1 ? 1 : 0 ) ? 4 : 5;

console.log(value1);//1
console.log(value2);//1
console.log(value3);//4
//并没有输出 get 5
因此,加上括号之后并不意味着表达式会先执行,括号可以理解为求值。也就是说表达式还是从左往右执行的,JavaScript会根据优先级与结合性来给表达式加上括号,在计算过程中,遇到括号就求括号的值,然后再继续运算。例如
var a, b;
a = b = 1;
//相当于:
a = ( b = 1 );
//(...)理解为求值运算,因此有
console.log( (b = 2) );//这里输出2
赋值运算符=,是右结合的。

关于JavaScript的优先级与结合性,汇总如下
优先级 运算类型 结合性 运算符
19 圆括号 n/a ( … )
18 成员访问 从左到右 … . …
需计算的成员访问 从左到右 … [ … ]
new (带参数列表) n/a new … ( … )
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 赋值 从右到左 … = …
… += …
… -= …
… *= …
… /= …
… %= …
… <<= …
… >>= …
… >>>= …
… &= …
… ^= …
… |= …
2 yield 从右到左 yield …
yield* 从右到左 yield* …
1 展开运算符 n/a ... …
0 逗号 从左到右 … , …

参考资料:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence
http://www.cnblogs.com/yy-hh/p/4624792.html
http://www.cnblogs.com/lvdabao/p/4280518.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章