Подтвердить что ты не робот

Что такое "x && foo()"?

Я видел где-то, сказал:

x && foo();

равно

if(x){
    foo();
}

Я протестировал его, и они действительно сделали то же самое.
Но почему? Что такое x && foo()?

4b9b3361

Ответ 1

Операторы AND и OR могут иметь ярлык.

Итак, && пробует второе выражение, если первое истинно (правдоподобно, точнее). Тот факт, что вторая операция делает материал (независимо от содержимого foo()), не имеет значения, потому что он не выполнил , если, что первое выражение оценивает что-то правдоподобное. Если это правда, то будет выполнено, чтобы попробовать второй тест.

И наоборот, если первое выражение в выражении || истинно, второе не затрагивается. Это делается потому, что весь оператор уже может быть оценен, результат будет равен true, независимо от результата второго выражения, поэтому он будет проигнорирован и останется неисполненным.

Случаи, которые следует учитывать при использовании таких ярлыков, как это, конечно, относятся к операторам, где определенные переменные все еще оценивают значения фальши (например, 0) и правдивые (например, 'zero').

Ответ 2

Это называется оценка короткого замыкания.

В этом случае, если x - False, тогда foo() не нужно оценивать (результат && всегда будет False); если x - True, это нужно оценить (даже если результат отброшен).

Ответ 3

Это не совсем эквивалентно. Первый - это выражение с возвращаемым значением, которое вы можете использовать; второй - это утверждение.

Если вас не интересует возвращаемое значение (то есть информация о том, соответствуют ли как x, так и foo() истинному значению), они эквивалентны, но обычно вы должны использовать только логическую версию если вы хотите использовать его как логическое выражение, например:

if (x && foo()) {
    do_stuff();
}

Если вас интересует только выполнение foo() условно (когда x является правдивым), предпочтительнее использовать вторую форму, поскольку она более четко передает намерение.

Причина, по которой люди могут предпочесть логическую версию, может заключаться в том, что javascript подвержен необычному ограничению: размер исходного кода (более подробный исходный код означает большую пропускную способность); поскольку логическая версия использует меньше символов, она более эффективна по полосе пропускания. Я бы предпочел больше verbose-версии большую часть времени, если только вопрос script не используется много - для библиотеки, такой как jQuery, использование таких оптимизаций, как это, совершенно оправдано, но в большинстве других случаев это не так.

Ответ 4

В javascript оператор && оценивает слева направо и возвращает значение самой правой операции. Если первое условие оценивается как false, оно не оценивает второе. Итак, это сокращение от слова "если что-то не равно null или undefined, сделайте что-нибудь"

Ответ 5

Это короткое замыкание.

Оператор && работает следующим образом: он выполняет логический или два операнда с обеих сторон. Если левая сторона имеет ненулевое значение, то правая часть оценивается для определения значения истины. Если левая сторона равна нулю, то какая бы ни была правая сторона, выражение будет оцениваться равным 0, поэтому правая часть не будет оценена. Таким образом, если x отличен от нуля, тогда вызывается только foo, а если x равно 0, то foo не вызывается, и поэтому в этом случае он работает как if - else.