我在Mithril.js
中看到了这段代码:
finish(state == 1 && 3)
对于我的(Java / C程序员)来说,如果finish(true)
为state
,则应始终调用1
,finish(false)
state
}}不是1
。但它实际上似乎对前者finish(3)
和后者finish(false)
。
这背后的逻辑是什么?
这是JavaScript中的惯用语,还是一个坏主意?对我而言,这是非常模糊的。
答案 0 :(得分:13)
您可以像这样解释运算符||
和&&
:
A || B
→ A ? A : B
A && B
→ A ? B : A
但未评估A
两次。
答案 1 :(得分:8)
在JavaScript中,&&
运算符不会将结果强制为布尔值。它反而类似于:
var _temp = state == 1;
finish(_temp ? 3 : _temp);
测试左侧的真实性,然后在 truthy 时返回右侧,否则返回左侧。
答案 2 :(得分:8)
这是JavaScript的特点,&&和||运算符总是返回它评估的最后一个值。
答案 3 :(得分:4)
比较a && b
实际上返回表达式中评估的最后一个值的值,而不是true
或false
。
您可以参考spec:
生产 LogicalANDExpression : LogicalANDExpression && BitwiseORExpression 评估如下:
- 让 lref 成为评估 LogicalANDExpression 的结果。
- 让 lval 为GetValue( lref )。
- 如果ToBoolean( lval )为false,则返回 lval 。
- 让 rref 成为评估 BitwiseORExpression 的结果。
- 返回GetValue( rref )。
醇>