Является ли оператор javascript if с несколькими условиями проверять их все?

В javascript при использовании инструкции if с несколькими условиями для тестирования javascript проверяет их все независимо, или он запустится, прежде чем тестировать их все, если это уже неверно?

Например:

 a = 1
 b = 2
 c = 1

 if (a==1 && b==1 && c==1)

Будет ли тест javascript для всех трех из этих условий или, увидев, что b не равен 1, и поэтому является ложным, выйдет из инструкции?

Я спрашиваю с точки зрения производительности. Если, например, я тестирую три сложных селектора jQuery, я бы предпочел, чтобы jQuery не пересекал DOM 3 раза, если через первый из них очевидно, что он вернет FALSE. (В этом случае было бы разумнее вложить 3 заявления if).

ДОБАВЛЕНИЕ: Больше любопытства, каков правильный термин для этого? Я замечаю, что многие из вас используют термин "короткое замыкание". Кроме того, некоторые языки делают это, а другие не?

Ответ 1

Оператор && "коротких замыканий" - то есть, если левое условие ложно, оно не требует оценки правильного.

Аналогично, оператор || замыкается, если левое условие истинно.

EDIT: Хотя вам не стоит беспокоиться о производительности до тех пор, пока вы не проведете сравнительный анализ и не решите, что это проблема. Преждевременная микро-оптимизация - это проницаемость ремонтопригодности.

Ответ 2

С точки зрения производительности это не микрооптимизация.

Если у нас есть 3 булевых переменных, a, b, c, это микрооптимизация.

Если мы вызываем 3 функции, которые возвращают логические переменные, каждая функция может занять много времени, и важно знать не только это короткое замыкание, но и в каком порядке. Например:

if (takesSeconds() && takesMinutes())

намного лучше, чем

if (takesMinutes() && takesSeconds())

если оба они в равной степени могут вернуть false.

Ответ 3

Что вы можете сделать в javascript-коде, например

var x = x || 2;

Это означало бы, что если x является undefined или иначе "false", то значением по умолчанию является 2.

Ответ 4

Если кто-то задается вопросом, есть ли способ принудительно выполнить оценку для всех условий, в некоторых случаях можно использовать побитовые операторы & и |

var testOr = true | alert(""); //alert pops up
var testAnd = false & alert(""); //alert pops up

Их следует использовать очень внимательно, потому что побитовые операторы являются арифметическими операторами, которые работают с одиночными битами их операнда и не могут всегда функционировать как "не короткая цепь" версии && и ||

Пример:

-2147483648 && 1 = 1 

но

-2147483648 & 1 = 0

Надеюсь, что это поможет кому-то, кто приехал сюда искать такую ​​информацию (как и я), и благодаря @Max для коррекции и встречного примера

Ответ 5

Он будет проверять только все условия, если первые из них верны, проверьте его сами:

javascript: alert (false && alert("A") && false);

Ответ 6

Это короткие замыкания - в вашем примере будут сравниваться только a и b.

Ответ 7

Он выходит, увидев, что b не равно одному.

Ответ 8

Другая причина, по которой остановка оценки с 1 или более параметрами слева.

if (response.authResponse && (response.authResponse.accessToken!= user.accessToken)) { ... }

вторая оценка полагается на то, что первая является истиной и не будет вызывать ошибку компиляции, если response.authResponse имеет значение null или undefined и т.д., потому что первое условие не удалось.

У других языков была эта проблема в ранние дни, и я думаю, что это стандартный подход в создании компиляторов сейчас.

Ответ 9

Для тех, кто по этому вопросу путается, потому что они не видят поведение короткого замыкания при использовании || в сочетании с оператором ?, например:

x = 1 || true ? 2 : 3 // value of x will be 2, rather than 1 as expected

похоже, что правило короткого замыкания не работает. Почему он оценивает второй член || (true? 2: 3), когда первое верно? Оказывается, это проблема порядка операций, так как выше это эквивалентно

x = (1 || true) ? 2 : 3

с оценкой ||, а второй - ?. Вероятно, вы хотите:

x = 1 || (true ? 2 : 3)