为什么`exp && "t" || "f"` 比 inline-if-else 慢很多?
Why is `exp && "t" || "f"` much slower than inline-if-else?
为什么 逻辑表达式n 比 if-else 或 inline-if-else[= 慢两倍24=]?
function logicalExp(val) {
return val && "t" || "f";
}
function inlineIfElse(val) {
return val ? "t" : "f";
}
function ifElse(val) {
if (val) return "t";
else return "f";
}
- 所有函数的计算结果相同。
- 所有函数都从
1
和 0
的数组中传递一个值,请参阅此 jsperf test。
因为它确实需要评估"t"
是否为真。 short-circuit expression return ((val && "t") || "f")
可以展开为
var and = val ? "t" : val;
var or = and ? and : "f";
return or;
当然,优化编译器可以静态地判断"t"
字面量的真实性,避免ToBoolean(val)
两次,但显然这在任何JS引擎中都没有做到。
因为
val && "t" || "f"
必须评估 val
,如果 val
评估为 true
,"t"
也是如此。
使用only false
is therefore significantly faster than only true
,但还是很慢。
为什么 逻辑表达式n 比 if-else 或 inline-if-else[= 慢两倍24=]?
function logicalExp(val) {
return val && "t" || "f";
}
function inlineIfElse(val) {
return val ? "t" : "f";
}
function ifElse(val) {
if (val) return "t";
else return "f";
}
- 所有函数的计算结果相同。
- 所有函数都从
1
和0
的数组中传递一个值,请参阅此 jsperf test。
因为它确实需要评估"t"
是否为真。 short-circuit expression return ((val && "t") || "f")
可以展开为
var and = val ? "t" : val;
var or = and ? and : "f";
return or;
当然,优化编译器可以静态地判断"t"
字面量的真实性,避免ToBoolean(val)
两次,但显然这在任何JS引擎中都没有做到。
因为
val && "t" || "f"
必须评估 val
,如果 val
评估为 true
,"t"
也是如此。
使用only false
is therefore significantly faster than only true
,但还是很慢。