Является ли оператор 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)