Ответ 1
Per спецификация, раздел 11.11: Бинарные логические операторы:
Произведение [оценки &&
]... оценивается следующим образом:
- Пусть lref является результатом оценки LogicalANDExpression.
- Пусть lval - GetValue (lref).
- Если
ToBoolean(lval)
false, верните lval. - Пусть rref является результатом оценки BitwiseORExpression.
- Возвращает GetValue (rref).
Произведение [оценки ||
]... оценивается следующим образом:
- Пусть lref является результатом оценки LogicalORExpression.
- Пусть lval - GetValue (lref).
- Если
ToBoolean(lval)
истинно, верните lval. - Пусть rref является результатом оценки LogicalANDExpression.
- Возвращает GetValue (rref).
Поэтому внутренне значение "преобразуется в логическое". Однако, поскольку это никогда не раскрывается - и все семантическое объяснение - это абстракция, которая может быть/ "оптимизирована" - поведение &&
и ||
можно просто объяснить с помощью правдоподобных и ложных значений (для которых ToBoolean
охватывает: истинное значение - это значение, для которого ToBoolean
возвращает true, все остальные значения являются ложными).
Логическая таблица для &&
:
a b result truthy any b falsy any a
Логическая таблица для ||
:
a b result truthy any a falsy any b
Обратите внимание, что возвращается либо оценка a
, либо b
.
Счастливое кодирование.
Для полноты, из раздела 9.2:
Абстрактная операция ToBoolean
преобразует свой аргумент в значение типа boolean as...
- Undefined - false
- Null - false
- boolean (not Boolean object!) - Результат равен входному аргументу (без преобразования).
- number (not Number object!). Результат равен false, если аргумент равен +0, -0 или NaN; иначе результат будет правдой.
- string (not String object!) - Результат является ложным, если аргумент является пустой строкой (ее длина равна нулю); иначе результат будет правдой.
- Объект - true