Ответ 1
Это характеристика JavaScript, && и || операторы всегда возвращают последнее оцениваемое значение.
Я наткнулся на этот код в Mithril.js
:
finish(state == 1 && 3)
Для моих (Java-программистов) глаз выглядит так, что он всегда должен вызывать finish(true)
, если state
есть 1
и finish(false)
, если state
не 1
. Но на самом деле это похоже на finish(3)
для первого и finish(false)
для последнего.
Какова логика этого?
Является ли это идиоматическим в JavaScript, или это плохая идея? Мне это ужасно неясно.
Это характеристика JavaScript, && и || операторы всегда возвращают последнее оцениваемое значение.
Вы можете интерпретировать операторы ||
и &&
следующим образом:
A || B
→ A ? A : B
A && B
→ A ? B : A
Но без оценки A
дважды.
В JavaScript оператор &&
не приводит результат к логическому. Он похож на:
var _temp = state == 1;
finish(_temp ? 3 : _temp);
Проверка правдоподобия левой стороны, а затем возвращение либо прав, либо правдивых, либо в противном случае.
Сравнение a && b
фактически возвращает значение, полученное последним значением в выражении, а не true
или false
.
Вы можете обратиться к spec:
Производство LogicalANDExpression: LogicalANDExpression && & BitwiseORExpression оценивается следующим образом:
- Пусть lref является результатом оценки LogicalANDExpression.
- Пусть lval - GetValue (lref).
- Если ToBoolean (lval) false, верните lval.
- Пусть rref является результатом оценки BitwiseORExpression.
- Возвращает GetValue (rref).