Я был уверен, что любое логическое выражение в Javascript вернет логическое значение, но это выражение возвращает число 0 вместо логического значения:

0 && true
> 0

Почему это так? Как мне подойти в этом случае к логическим выражениям в Javascript, чтобы предотвратить подобные ошибки в будущем?

Предыстория - я был сбит с толку этим утверждением в jQuery:

$('.something').toggle(0 && true);

Он не переключает элемент, потому что возвращается «0», а не логическое значение!

Может быть, есть какие-то умные причины, почему это так, но не могу сказать, что мне это нравится.

12
Tool 14 Сен 2018 в 09:42

2 ответа

Лучший ответ

В документации по оператору && говорится:

expr1 && expr2: возвращает expr1, если его можно преобразовать в false; в противном случае возвращает expr2.

Вот почему он возвращает первое значение: 0

Источник: https://developer.mozilla.org / EN- US / Docs / Web / JavaScript / Справочник / Операторы / Logical_Operators # Описание

Вы ожидали в результате false (логическое), однако логическое значение результирующего значения также является ложным. Это означает, что вы можете использовать его в условии (if) и иметь ожидаемое поведение.

Если вам нужно сохранить его в переменной и вы предпочитаете иметь логическое значение, вы можете преобразовать его. Это можно сделать с помощью двойного отрицания: !!

!!(0 && true)

Или используя Boolean:

Boolean(0 && true)

13
Maxime Chéramy 14 Сен 2018 в 06:58

Как заметил @Maxime Chéramy, JavaScript проверяет, возвращает ли первый элемент false, и не проверяет второй. Это экономит время расчета.

JS не нужно проверять оба оператора, если первое неверно, он не будет проверять второй, он просто вернет первый. Если первое истинно, оно опять же не проверяет второе, а просто возвращает его.

Число, объект, массив или строка верны.

Используйте Boolean (), чтобы получить логическое значение, или используйте короткий метод !! ()

'banana' && true  // returns true

Но

true && 'banana' // returns 'banana'
Boolean(true && 'banana') // returns 'true'
!!(true && 'banana') // returns 'true'

С тремя

true && 'banana' && 1 // returns 1
true && 1 && 'banana' // returns 'banana'
1 && 'banana' && true // returns true
Boolean(true && 'banana' && 1) // returns 'true'
!!(1 && 'banana' && true) // returns 'true'
2
Daut 14 Сен 2018 в 07:16