为什么在Javascript中Boolean()这么慢?

Qan*_*avy 8 javascript performance boolean

根据ECMAScript规范,两者一元逻辑非运算符(!)和Boolean()函数使用的内部功能ToBoolean(),以及NOT操作者也做了一些检查,以逆转的结果.那么为什么双逻辑NOT运算比运行函数快得多Boolean()呢?

我使用以下代码来测试哪个更快:

function logicalNotOperator() {
  var start = performance.now();
  for (var i = 0; i < 9999999; i++) !!Math.random();
  return 0.001 * (performance.now() - start);
}
 
function booleanFunc() {
  var start = performance.now();
  for (var i = 0; i < 9999999; i++) Boolean(Math.random());
  return 0.001 * (performance.now() - start);
}

var logicalNotOperatorResult = logicalNotOperator();
var booleanFuncResult = booleanFunc();
var diff = booleanFuncResult - logicalNotOperatorResult;

console.log('logicalNotOperator:', logicalNotOperatorResult);
console.log('booleanFunc:', booleanFuncResult);
console.log('diff:', diff);
Run Code Online (Sandbox Code Playgroud)

注意:我不是指new Boolean()构造函数,而是Boolean()强制它赋予布尔值的参数的函数.

Ven*_*Ven 7

虽然Boolean将调用该函数(内部优化),但大多数JIT都会内联双重而不使用更快的XOR(源代码参考 - JägerMonkey).

和JSperf:http://jsperf.com/bool-vs-doublenot

  • 这是为了避免JIT将其全部优化,因为它没有副作用. (2认同)