Javascript的三元运算符语义

时间:2017-05-31 15:41:23

标签: javascript

我试图深入研究jQuery的src代码,并且在jQuery的开发版本(3.2.1)中的src代码的最开始,我们发现:

( function( global, factory ) {
"use strict";
if ( typeof module === "object" && typeof module.exports === "object" ) {
    module.exports = global.document ?
        factory( global, true ) :
        function( w ) {
            if ( !w.document ) {
                throw new Error( "jQuery requires a window with a document" );
            }
            return factory( w );
        };
} else {
    factory( global );
}

就我的知识而言,我知道三元运算符是在一些条件之后出现的,但是它出现在赋值运算符module.exports = global.document ?之后。你能解释一下吗?它在上一个代码的上下文中做了什么?

2 个答案:

答案 0 :(得分:4)

三元运算符允许有条件地计算两个表达式(条件为真时为第一个,否则为第二个)。

module.exports = global.document ?
        factory( global, true ) :
        function( w ) {
            if ( !w.document ) {
                throw new Error( "jQuery requires a window with a document" );
            }
            return factory( w );
        };

分配意味着条件评估的结果被分配给module.export

三元运算符是一个语法糖,其工作原理如下:

function ternary_operator(condition, expression1, expression2) {
    if (condition) {
        return expression1;
    } else {
        return expression2;
    }
}

因此您可以将代码翻译为:

module.exports = ternary_operator(global.document,
        factory( global, true ),
        function( w ) {
            if ( !w.document ) {
                throw new Error( "jQuery requires a window with a document" );
            }
            return factory( w );
        });

请注意:

factory( global, true )

    function( w ) {
        if ( !w.document ) {
            throw new Error( "jQuery requires a window with a document" );
        }
        return factory( w );
    };

它们都是表达式:激活factory函数的结果是表达式;函数值的定义也是一个表达式。

懒惰评估

函数ternary_operator提供了一个渴望的三元运算符。表达式在条件内进行评估,然后返回其中一个表达式。例如:

var l = ternary_operator(C, A, B);
1. evaluate C
2. evaluate A
3. evaluate B
4. activate function ternary_operator
5. assign to l the result of the function

Javascript三元运算符是惰性的:这意味着首先评估条件,然后只评估另一个表达式中的一个,从而获得性能。

var l = C ? A : B;
1. evaluate C
2.1 if C is true evaluate A
2.2 if C is false evalutate B
3. assign to l the expression evaluated

答案 1 :(得分:1)

a=b?c:d;

在这种情况下,三元运算符不检查 a = b ,而是检查 b 。这是因为赋值运算符比三元运算符具有更高的运算符前提,这是有充分理由的。

(a=b)?c:d;

在这种情况下,三元运算符确实测试 a = b 。在这种情况下,它会将b存储在a中并返回该值。