Flower Of Life 发热巫女
  1. 1 Flower Of Life 发热巫女
  2. 2 Last Surprise Lyn
  3. 3 Time Bomb Veela
  4. 4 Life Will Change Lyn
  5. 5 One Last You Jen Bird
  6. 6 Hypocrite Nush
  7. 7 BREAK IN TO BREAK OUT Lyn
  8. 8 Warcry mpi
  9. 9 かかってこいよ NakamuraEmi
  10. 10 Libertus Chen-U
2017-02-19 12:20:46

JS中运算符结合性和优先级

最近看JQ源码时发现经常有等号连用的情况,虽然个人不是很喜欢这种写法,但有些时候确实能精简代码长度。这里做个小结,以后阅读他人代码时也方便理解。


先看这样一道题目:

var a = 'x';
console.log('the result is' + (a === 'x') ? 'sth' : 'nth' );

这题考察的点就是运算符的优先级和结合性。

优先级和结合性

根据MDN的定义可知,优先级决定表达式中运算执行的先后顺序。 例如

3 + 4*5 //23

这里乘法运算符就比加法运算符有更高的优先级,所以先执行乘法。 而结合性决定了拥有相同优先级运算符的执行顺序,结合性分为左结合和右结合。例如

a = b = 5;

由于赋值运算符为右结合,所以b先被赋值为5,然后将b=5的返回值赋值给a。 所以表达式中运算执行的规则为:先按照优先级顺序执行,当优先级相同时,按照结合性顺序执行。MDN上有具体的汇总表就不在这里贴出。


注意事项

说一下比较关键的几个点。 1.圆括号的优先级最高,成员访问(.形式或[ ]形式)的优先级第二。 这么高的优先级代表什么意思呢?来看这样一个例子。

var a = {n: 1};
a.x = a = {n: 2};
console.log(a); //{n: 2}
console.log(a.x); //undefined

这里乍一看按照赋值运算符的右结合性,a.x的实际值应该为{n: 2}。但其实由于成员访问的优先级更高,a.x优先于所有赋值运算符进行运算,这是什么概念呢?我们都知道变量声明后再解析,那么var a是所有计算前最开始的一步,然后按顺序执行,a内存储指针指向{n: 1}。当执行到下一行时,a.x优先于所有赋值,则a.x取到的值为原引用对象内的x。然后再将新的引用对象指针赋值给a和a.x。那么下面打印的a.x则是新的引用对象内的x了,理所当然为undefined。 2.typeof优先级比四则运算更高,所以在复杂表达式中使用时,最好加上括号,例子如下:

typeof 2+3 //错误,输出number3
typeof (2*3) //正解

3.赋值运算符优先级十分低并且为右结合性,一般在表达式中赋值都在最后计算。 4.逻辑非操作符优先级较高而且高于四则运算,而逻辑或和逻辑与优先级较低,联合使用时按左结合来计算,结合逻辑操作符的短路特性就很容易理解一些连续逻辑操作的表达式了。例子如下:

var a = 1 && 2 && 3 //1 && 2由于1为真返回2,2 && 3由于2为真返回3
var b = 1 || 2 || 3 //1 || 2由于1为真返回1,1 || 3由于1为真返回1

了解了优先级和结合性的特性,再去看文章最初的题目就很简单了,分解如下:

var a = 'x';
console.log('the result is' + (a === 'x') ? 'sth' : 'nth' );
//console.log('the result is' + true ? 'sth' : 'nth');
//console.log('the result is true' ? 'sth' : 'nth');
// 结果为sth

-- EOF --

添加在分类「 前端开发 」下,并被添加 「JavaScript」 标签。