2015-04-29 4 views
3

Как сказано в названии, я не могу понять, почему (true & & {}) дает мне {}, но обратное не то же самое.Почему (true && {}) оценивается как {}, но ({} && true) имеет значение true?

Редактировать: В качестве продолжения, поскольку я использую логический оператор, почему это выражение не дает мне логическое значение при оценке?

+0

Операторы JavaScript '&&' и '||' не дают логических значений. Они отличаются от аналогичных операторов в Java и C и т. Д. Они возвращают значение одного или другого из их операндов. – Pointy

ответ

6

Выражения операндов до && оцениваются слева направо. Значение выражения && - это значение последнего оцениваемого подвыражения. В вашем случае это будет самым правильным выражением в обоих случаях.

Итак, с (true && {}), оператор && оценивает true. Это не фальшивка, поэтому он оценивает {} и возвращает результат выражения.

С ({} && true) он делает то же самое в обратном порядке, поэтому второе оцениваемое выражение равно true.

+0

Отличное объяснение! Благодаря! (Я приму ответ, когда пройдут достаточно времени, так что я не позволю так быстро принять его). –

0

a && b вернет a если a является фальсификатором, в противном случае b.

В самом деле, если a является falsy (например, '', null, undefined, 0), JavaScript не требуется, чтобы оценить остальную часть выражения, как это false так или иначе. Однако он не возвращает false, но первый falsy значение. Однако, если a правдиво, необходимо оценить остальное, чтобы узнать результат выражения.

У вас есть обратная логика при использовании ||.

Теперь в вашем примере, {} является truthy, так

(true && {}) // {} 
({} && true) // true 
({} && true && 42 && '' && true && {}) // '' as first falsy value 
+1

Почему использование булевых операторов не дает мне логическое значение при оценке? –

+2

Так как Javascript создан, он избегает создания yoo другого логического значения, просто возвращая вам тот, у которого есть истинное/фальшивое значение, которое вы ожидаете. Вы можете использовать '!! val', чтобы получить истинное логическое значение из правды/ложности. – floribon

0

Это связано с truthy и falsy логики в JavaScript. Все объекты, которые не являются: undefined, null, false или 0 являются правдивыми. Операнды && и || оцениваются слева направо и имеют короткое замыкание. Выражение оценивается значением последнего оцененного операнда. например:

true && false // will evaluate to false 
true || false // will evaluate to true 
Смежные вопросы