Проверяет ли все операторы javascript if несколько условий? - PullRequest
85 голосов
/ 18 декабря 2009

В 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).

ADDENDUM: Больше любопытства, каков правильный термин для этого? Я заметил, что многие из вас используют термин «короткое замыкание». Кроме того, некоторые языки делают это, а другие нет?

Ответы [ 9 ]

130 голосов
/ 18 декабря 2009

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

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

РЕДАКТИРОВАТЬ: Тем не менее, вы не должны беспокоиться о производительности, пока вы не сравнитесь и не определите, что это проблема. Преждевременная микрооптимизация - основа ремонтопригодности.

13 голосов
/ 19 декабря 2009

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

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

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

if (takeSeconds () && takeMinutes ())

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

if (takeMinutes () && takeSeconds ())

если оба с равной вероятностью вернут false.

10 голосов
/ 21 сентября 2015

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

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

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

Пример:

-2147483648 && 1 = 1 

но

-2147483648 & 1 = 0

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

10 голосов
/ 18 декабря 2009

Вот почему вы можете сделать в коде JavaScript, как

var x = x || 2;

Что означало бы, что если x не определено или иным образом равно false, то значением по умолчанию является 2.

7 голосов
/ 18 декабря 2009

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

javascript: alert (false && alert("A") && false);
3 голосов
/ 18 декабря 2009

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

2 голосов
/ 07 мая 2012

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

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

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

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

2 голосов
/ 18 декабря 2009

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

1 голос
/ 12 сентября 2017

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

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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...