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

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

42 голосов
/ 07 августа 2011

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

x && foo();

равно

if(x){
    foo();
}

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

Ответы [ 5 ]

67 голосов
/ 07 августа 2011

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

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

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

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

24 голосов
/ 07 августа 2011

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

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

8 голосов
/ 07 августа 2011

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

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

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

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

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

3 голосов
/ 07 августа 2011

В javascript оператор && вычисляет слева направо и возвращает значение самой правой операции. Если первое условие оценивается как ложное, оно не оценивает второе. Таким образом, это сокращение от слова ", если что-то не является нулевым или неопределенным, сделайте что-то "

2 голосов
/ 07 августа 2011

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

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

...