JavaScript 如何解析链式三元表达式?

Posted

技术标签:

【中文标题】JavaScript 如何解析链式三元表达式?【英文标题】:How does JavaScript parse chained ternary expressions? 【发布时间】:2014-11-12 03:52:07 【问题描述】:

我正在阅读 jQuery source code for jQuery.filter 并偶然发现了这一堆

jQuery.filter = function( expr, elems, not ) 
    var elem = elems[ 0 ];

    if ( not ) 
        expr = ":not(" + expr + ")";
    

    return elems.length === 1 && elem.nodeType === 1 ?
        jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
        jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) 
            return elem.nodeType === 1;
        ));
;

总之我们有

return "a" && "b" ? "c" ? "d" : "e" : "f";

每个字符串都可以是不同的值

我的问题不是如何破译这段代码,而是我的大脑正在纠结,试图评估这里使用的逻辑。

谁能帮我理解 javascript 如何评估这个返回表达式?

【问题讨论】:

显然c ? d : e 必须是一个子表达式(没有其他有意义的方式来解释这些标记)。因此,真正归结为a && b ? x : y(a && b) ? x : y 还是a && (b ? x : y)。但这肯定可以通过简单的 Google 搜索“javascript 优先级”或类似内容来解决? jQuery 中的某个人应该学会使用大括号,尽管它在框架大小上花费了 2 位... 另外,代码格式实际上在这种情况下很容易。 【参考方案1】:

条件运算符是右结合的,逻辑运算符具有更高的优先级,所以这样:

return "a" && "b" ? "c" ? "d" : "e" : "f";

相当于这个:

return ( ("a" && "b") ? ("c" ? "d" : "e") : "f" );

或全部:

if ("a" && "b") 
    if ("c") 
        return "d";
     else 
        return "e";
    
 else 
    return "f";

参考

MDN: Operator precedence

【讨论】:

谢谢,小马。你真是一匹漂亮的小马。

以上是关于JavaScript 如何解析链式三元表达式?的主要内容,如果未能解决你的问题,请参考以下文章

Yaml 中的三元运算符

三元表达式 列表解析

Python基础三元表达式列表解析生成器表达式

python3 三元表达式,列表解析

十七python沉淀之路--三元表达式列表解析

JavaScript - 为啥包含括号会导致三元表达式错误?