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

Qwe*_*rty 0 javascript performance jsperf

为什么逻辑表达式if-elseinline-if-else慢两倍?

function logicalExp(val) {
  return val && "t" || "f";
}

function inlineIfElse(val) {
  return val ? "t" : "f";
}    

function ifElse(val) {
  if (val) return "t";
  else return "f";
}
Run Code Online (Sandbox Code Playgroud)
  • 所有功能都评估相同的结果.
  • 所有函数都从一个数组中传递一个值,10参见此jsperf测试.

Ber*_*rgi 8

因为它确实需要评估是否"t"真实.所述短路表达 return ((val && "t") || "f")可扩展到

var and = val ? "t" : val;
var or = and ? and : "f";
return or;
Run Code Online (Sandbox Code Playgroud)

当然,优化编译器可以静态地确定"t"文字的真实性,并避免做ToBoolean(val)两次,但显然这不是在任何JS引擎中完成的.