这次讨论一下JavaScript运算符的结合性和优先级问题

相关知识链接:MDN运算符优先级jingxian:浅谈JS运算符&&和|| 及其优先级

来源一篇知乎上的问题:JavaScript中运算符优先级的问题


这是知友乐已生悲回答的答案:

        var a = 0;
        console.log(
            5 > 3 && 8 < 4 + (a = 5)
        )

表达式“5 > 3 && 8 < 4 + (a = 5)”自左向右扫描。首先处理“5 > 3”(因为关系运算符“>”优先于逻辑运算符“&&”)。在关系运算符“>”两侧的5 和 3 作为数值参加关系运算,“5>3”的值为true。再进行“true && 8 < 4 + (a = 5)”的运算,“&&”左边为true,则进行它右边表达式的运算。8的左侧为“&&”,右侧为“<”运算符,根据优先规则,应先进行“<”的运算,即先进行“8 < 4 + (a = 5)”的运算。现在4的左侧为“<”,右侧为“+”运算符,而“+”运算符优先于“<”,应先进行“4 + (a = 5)”,由于“()”的级别最高,因此先进行“a=5”,得到结果5。然后进行“4 + 5”的运算,得到结果9,再进行“8 < 9”的运算,得到true,最后进行“true && true”,得到true。(这个例子是模仿《c程序设计》第四版94页的例子)

作者:乐己生悲
链接:https://www.zhihu.com/questio...
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我在变换一下几个式子,试着求值。

        5 > 3 && 8 < 4 + (a = 5);
        
        false && 8 < 4 + 3        // false : 由于AND操作符左边的运算为false,短路,直接返回false
        
        5 > 2 || 2 > 4 && 3 > 2    
        // true : 依次从左向右运算,5>2:true,则 true || 2 > 4 && 3 > 2。由于OR操作符左边的运算为真,短路,直接返回OR左边的值。右边表达式全部忽略;
        
        1 > 2 || 0 && 3 > 2    
        // 0:从左至右,OR表达式为左结合,则1>2:false,则false || 0 && 3 > 2。此时是对OR整个右边的值求值,则0 && 3 > 2,>优先级高于AND,则3>2:true。
        // 此时则为0 && true,AND为左结合,先对左边求值,求值为0,直接返回0,此时最后才是false || 0,OR运算符为左结合,左边求值false,则直接返回右值0。
        // 看来的确是对的-0-,我是边分析最后才console,万一错了,上面的思路都编程瞎掰的了......
        
        var a = 5;
        0 || 6 > a++ && 50 > (3+2)*2
        console.log(a);
        // 依旧从左至右,后面我会用函数来证明,JavaScript执行语句大多数情况上到下,左到右。优先级是根据结合性来判断的,并不是单纯的谁优先谁就先算
        
        // 对OR左边求值,为0,则继续对右边求值,即6 > a++ && 50 > (3+2)*1,依旧从左至右。a++是后置自增,后置运算无结合性。则会先使用a后自增,此时相当于
        // (6 > 5)++,运算进行到AND,依旧是左结合,左边的运算已经为true,则直接对右边继续求值,即50 > (3+2)*2,大括号优先级最高,先加法后乘法,则(3+2)*2:10
        // 最后才是50 > 10,结果为true,则AND返回的是右边表达式的值:true。最后最后得出true。
        // console我对了,可以试试把AND右边整体的值换成1,再次console应该是:1。
        // a:6
        
        
        var x = 5;
        var y = 3+2*x++;
        alert(y+" | "+x)    // y的值是13还是15? 是13
        // 从左至右,此时遇上的运算符有+、*、后置自增。则应考虑优先级,即(3 + (2 * (x)))++
        // 没错,自增是最后才进行的。具体可以看segmentfault里JS表达式语句4.6.4
        // 计算2*5之后,与3相加,最后赋值给y,做完这些,x才自增,这就是后置递增递减运算符的特性。

Queen
139 声望20 粉丝