为什么`exp && "t" || "f"` 比 inline-if-else 慢很多?

Why is `exp && "t" || "f"` much slower than inline-if-else?

为什么 逻辑表达式n 比 if-elseinline-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";
}
  • 所有函数的计算结果相同。
  • 所有函数都从 10 的数组中传递一个值,请参阅此 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,但还是很慢。