资讯专栏INFORMATION COLUMN

JavaScript优先级与结合性

FleyX / 3006人阅读

摘要:首先处理因为关系运算符优先于逻辑运算符。在关系运算符两侧的和作为数值参加关系运算,的值为。现在的左侧为,右侧为运算符,而运算符优先于,应先进行由于的级别最高,因此先进行,得到结果。此时是对整个右边的值求值,则,优先级高于,则。

这次讨论一下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才自增,这就是后置递增递减运算符的特性。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/82852.html

相关文章

  • JavaScript程序设计》—— 第二章 编程

    摘要:变量名必须以字母美元符号下划线开始,只能包含字母数字下划线和美元符号。你有元现在是第年小练习计算从和增长到自身的倍需要的次数。 2.3 程序的构成 表达式,用于计算并得到值; 变量,用于保存数据,以便将来使用; 语句,用于执行脚本的操作; 2.3.1 表达式 2 2+8.1+5 (2+8.1)* 5 9>4 9>4 && 1===2 dog+house Hello.length ...

    sean 评论0 收藏0
  • 由ES规范学JavaScript(二):深入理解“连等赋值”问题

    摘要:有这样一个热门问题其实这个问题很好理解,关键要弄清下面两个知识点引擎对赋值表达式的处理过程赋值运算的右结合性一赋值表达式形如的表达式称为赋值表达式。赋值表达式是右结合的。 有这样一个热门问题: var a = {n: 1}; var b = a; a.x = a = {n: 2}; alert(a.x); // --> undefined alert(b.x); // --> {n: ...

    JasonZhang 评论0 收藏0
  • 基于JavaScript求解八数码最短路径并生成动画效果

    摘要:写在最前本次分享一下通过广度优先搜索解决八数码问题并展示其最短路径的动画效果。一个排列中逆序的总数就称为这个排列的逆序数。如果起始状态与结束状态的逆序数的奇偶性相同,则说明状态可达,反之亦然。 写在最前 本次分享一下通过广度优先搜索解决八数码问题并展示其最短路径的动画效果。 欢迎关注我的博客,不定期更新中—— 效果预览 该效果为从[[2, 6, 3],[4, 8, 0],[7, 1, ...

    Jioby 评论0 收藏0
  • JavaScript程序设计》—— 第三章 数据章 总结及练习

    摘要:如果参数不在与之间,该方法将返回一个空字符串这个不解释了方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。 主要总结 JavaScript的六种数据类型:Boolean、Number、String、Null、Undefined、Object 布尔类型 布尔真假判定:短路原则 x && y 只有在x和y都为真的情况下为真。即真真为真,短路:因比较运算为左...

    W4n9Hu1 评论0 收藏0
  • C语言运算符的先级结合详细解说

    摘要:结合性当一个运算对象两侧的运算符优先级别相同时,则按运算符的结合性来确定表达式的运算顺序。大多数运算符结合方向是左结合性,只有三类运算符的结合方向是右结合性,即单目运算符条件运算符赋值运算符。 C语言运算符的优先级和结合性详细解说 优先级 运算符 含义 使用形式 结合性 操作数 ...

    aristark 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<