Почему `(состояние == 1 && 3)` имеет смысл?

Я наткнулся на этот код в Mithril.js:

finish(state == 1 && 3)

Для моих (Java-программистов) глаз выглядит так, что он всегда должен вызывать finish(true), если state есть 1 и finish(false), если state не 1. Но на самом деле это похоже на finish(3) для первого и finish(false) для последнего.

Какова логика этого?

Является ли это идиоматическим в JavaScript, или это плохая идея? Мне это ужасно неясно.

Ответ 1

Это характеристика JavaScript, && и || операторы всегда возвращают последнее оцениваемое значение.

Ответ 2

Вы можете интерпретировать операторы || и && следующим образом:

    A || B
→   A ? A : B

    A && B
→   A ? B : A

Но без оценки A дважды.

Ответ 3

В JavaScript оператор && не приводит результат к логическому. Он похож на:

var _temp = state == 1;
finish(_temp ? 3 : _temp);

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

Ответ 4

Сравнение a && b фактически возвращает значение, полученное последним значением в выражении, а не true или false.

Вы можете обратиться к spec:

Производство LogicalANDExpression: LogicalANDExpression && & BitwiseORExpression оценивается следующим образом:

  • Пусть lref является результатом оценки LogicalANDExpression.
  • Пусть lval - GetValue (lref).
  • Если ToBoolean (lval) false, верните lval.
  • Пусть rref является результатом оценки BitwiseORExpression.
  • Возвращает GetValue (rref).