В javascript, при использовании оператора if с несколькими условиями для проверки, проверяет ли javascript их все независимо, или он откажется от проверки их всех, если он уже ложен?
Например:
a = 1
b = 2
c = 1
if (a==1 && b==1 && c==1)
Будет ли javascript проверять все 3 из этих условий или, увидев, что b не равно 1 и, следовательно, ложно, выйдет ли он из оператора?
Я спрашиваю с точки зрения производительности. Если, например, я тестирую 3 сложных селектора jQuery, я бы предпочел, чтобы jQuery не пересекал DOM 3 раза, если по первому из них очевидно, что он вернет FALSE. (В этом случае имеет смысл вложить 3 оператора if).
ДОБАВЛЕНИЕ: Скорее любопытство, как правильно это обозначить? Я заметил, что многие из вас используют термин «короткое замыкание». Кроме того, некоторые языки делают это, а другие - нет?
источник
Ответы:
&&
Оператор «короткое замыкание» - то есть, если левое условие ложно, это не мешает оценить правильную.Точно так же
||
оператор замыкается, если левое условие истинно.РЕДАКТИРОВАТЬ: Тем не менее, вам не следует беспокоиться о производительности, пока вы не проведете сравнительный анализ и не определите, что это проблема. Преждевременная микрооптимизация - это проклятие ремонтопригодности.
источник
if (!barSticky && bar.parent().offset().top <= document.documentElement.scrollTop)
пример : второе условие - более затратный расчет, первое - просто логическое. :)С точки зрения производительности это не микрооптимизация.
Если у нас есть 3 логических переменных, a, b, c, это микрооптимизация.
Если мы вызовем 3 функции, которые возвращают логические переменные, каждая функция может занять много времени, и важно не только знать, как это происходит, но и в каком порядке. Например:
намного лучше чем
если оба с одинаковой вероятностью вернут false.
источник
Вот почему вы можете сделать в коде javascript, например
Это означало бы, что если x не определено или иначе «ложно», то значение по умолчанию равно 2.
источник
Если кому-то интересно, есть ли способ принудительно оценить все условия, в некоторых случаях можно использовать побитовые операторы
&
и|
Их следует использовать очень осторожно, потому что побитовые операторы - это арифметические операторы, которые работают с отдельными битами своего операнда и не всегда могут работать как "не короткозамкнутые" версии
&&
и||
Пример:
но
Надеюсь, это поможет кому-то, кто прибыл сюда в поисках такой информации (например, я), и спасибо @Max за исправление и контрпример.
источник
false && (alert(""))
решение работать: /var a=false; var b=check(); alert(a && b);
Он будет проверять все условия только в том случае, если первые из них верны, проверьте это сами:
источник
Это короткое замыкание - в вашем примере будут сравниваться только a и b.
источник
Еще одна причина, по которой останавливается оценка с одним или несколькими параметрами слева.
if (response.authResponse && (response.authResponse.accessToken! = user.accessToken)) {...}
вторая оценка полагается на истинность первого и не выдаст ошибку компиляции, если response.authResponse имеет значение null или undefined и т.д., потому что первое условие не выполнено.
Раньше у других языков была эта проблема, и я думаю, что сейчас это стандартный подход к созданию компиляторов.
источник
Он выходит после того, как увидит, что b не равно единице.
источник
Для всех, кто задается этим вопросом в замешательстве, потому что они не видят поведения короткого замыкания при использовании
||
в сочетании с таким?
оператором:x = 1 || true ? 2 : 3 // value of x will be 2, rather than 1 as expected
похоже, что правило короткого замыкания не работает. Почему он оценивает второй член
||
(верно? 2: 3), когда первое верно? Оказывается, это проблема порядка операций, потому что приведенное выше эквивалентноx = (1 || true) ? 2 : 3
с
||
оцениваемым первым и?
оцениваемым вторым. Скорее всего, вы захотите:x = 1 || (true ? 2 : 3)
источник