Тернарный оператор Javascript семантический

1

Я пытаюсь погрузиться в src-код jQuery, и в самом начале кода src в версии (3.2.1) разработки jQuery мы находим:

( 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 ответа

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
a=b?c:d;

В этом случае тернарный оператор не проверяет a = b, а скорее на b. Это связано с тем, что оператор присваивания имеет более высокую предрасположенность оператора, чем троичный оператор, по уважительной причине.

(a=b)?c:d;

В этом случае тройной оператор действительно проверяет a = b. В этом случае он сохранит b в и вернет это значение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню