Сделайте && и || операторы преобразуют свои операнды в булев?

В книге JavaScript Flanagan O'Reilly указано:

В отличие от && и || операторов,! оператор преобразует свой операнд в булево значение [...] перед инвертированием преобразованного значения.

Если эти логические операторы не преобразуют операнды в booleans, как можно оценить выражение?

Ответы

Ответ 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

Ответ 2

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

var x = false || 'Hello' // gives you 'Hello'
var y = 0 && 1           // gives you 0, because 0 is "falsy" and short circuits
var z = 1 || 2           // gives you 1, because 1 is "truthy" and short circuits

Ответ 3

Операнды интерпретируются как логические значения для вычисления выражения, но возвращаемое значение && или || всегда является одним из операндов.

Например:

true && 0 === 0, not false
1 || false === 1, not true

Ответ 4

Потому что у JavaScript есть идея правша, которая охватывает более логических значений.