2016-12-18 2 views
1

Я хотел прояснить кое-что.Логические && и || операторы в JavaScript

Рассмотрим это:

var a = 42; 
var b = "abc"; 
var c = null; 

a || b;  // 42 
a && b;  // "abc" 
c || b;  // "abc" 
c && b;  // null 

Я знаю, что для оператора ||, если тест на первый операнд верно, то выражение результатов || в значении первого операнда (или С). Если тест является ложным, выражение || приводит к значению второго операнда (b).

И наоборот, для оператора &&, если проверка истинна, выражение && приводит к значению второго операнда (b). Если тест является ложным, результаты && выражение в значении первого операнда (или С)

Так что же происходит, когда вы используете && и || операторов цепочки ценности, как:

if(a && b && c && d && e){ 
    //do something; 
} 

if(a || b || c || d || e){ 
    //do something 
} 

Что именно происходит, когда вы связываете значения? Потому что в первом примере (с участием оператора &&), если a истинно, то b должно быть возвращено правильно? так что c или d даже учитываются в этой точке?

+2

https://developer.mozilla.org/en-US/docs/Glossary/Truthy и https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators#Logical_OR – ceejayoz

+0

В первом выражении c, d и e определенно не игнорируются (если только a или b не были ложными и выражение коротко замкнуто). В цепочке из && возвращаемое значение будет первым ложным выражением или окончательным выражением, если все являются правдивыми. Когда вы фактически не присваиваете результат чему-то, вам, как правило, не нужно беспокоиться о том, что возвращается или нет - первое выражение выполняется, если a, b. с. д. и е все являются правдивыми, а второе выражение выполняется, если хотя бы один из них правдивый. – PMV

+0

Спасибо, что поняли, что это действительно полезный ответ! –

ответ

5

Так что же происходит, когда вы используете && и || операторы с СЦЕПЛЕНИЕ значениями

&& является бинарным оператором, с одной левого операнда и одного правого операнда. Выражение a && b && c && d && e анализируется на основе associativity rules так, что это выглядит следующим образом:

if (a && (b && (c && (d && e)))) { 

на основе семантики &&, если a является falsy, все состояние сразу вычисляет a, который falsy. Если a правдиво, то выражение оценивается с правой стороны, которое равно b && (c && (d && e))). В этом случае, если b является ложным, то это подвыражение и, следовательно, все выражение сразу оценивают до b, что является ложным; если b правдиво, то подвыражение оценивается с правой стороны, которое равно c && (d && e), и процесс продолжается.

Конечным результатом является интуитивное поведение, которое для всего выражения будет falsy, и, следовательно, для if ветви к не быть приняты, достаточно для любой переменных быть falsy. Оценка будет «короткой замыкающей», что приведет к фальши - как только будет встречена какая-либо фальшивая переменная. Для того чтобы все выражение было правдивым и поэтому для ветви if, все переменные должны быть правдивыми.

Для || логика отменена. Для того чтобы все выражение было правдивым и, следовательно, для ветви if, необходимо, чтобы любая из переменных была правдивой. Оценка будет «коротким», что приведет к правдивости - как только появится первое правдоподобное значение. Для того чтобы все выражение было ложным, и поэтому для ветви ifне должно быть, все переменные должны быть фальшивыми.

You Don't Know JS также имеет хорошее объяснение.

+0

«Нет, интерпретатор должен оценивать все значения только в том случае, если они все верны, иначе это будет короткое замыкание при первом значении ложности». Важная разъясняющая деталь, спасибо. Обновите мой ответ, чтобы принять его во внимание. –

0

Что именно происходит, когда вы связываете значения?

В первом выражении (& &) все значения должны быть truthy для того, чтобы проверка условия, чтобы пройти. Предполагая, что все значения являются правдивыми, интерпретатор будет оценивать все значения и будет проходить условный тест. В противном случае он будет оценивать до первого значения ложности, и условный тест завершится с ошибкой.

Во втором выражении (||) только одно значение должно быть правдивым для прохождения условного теста. Предполагая, что хотя бы одно значение является правдивым, интерпретатор будет оценивать до первого значения правды и будет проходить условный тест. В противном случае он будет оценивать все значения, и условный тест потерпит неудачу.

Смежные вопросы