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/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* …
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值