9

根据 ECMAScript 规范,一元逻辑 NOT 运算符( !) 和函数Boolean()使用内部函数ToBoolean(),并且 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);

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

4

2 回答 2

7

虽然Boolean将调用函数(内部优化),但大多数 JIT 将内联双精度而不使用 XOR,这要快得多(源代码参考- JägerMonkey)。

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

于 2013-03-11T09:51:47.223 回答
0

我不知道 Javascript JIT 编译器是如何在内部执行的。同样,现在布尔函数在 2020 年在 Chrome 中运行得更快。但是如果有一些不同的浏览器、不同的版本或不同的 JS 引擎!!运算符运行得更快,我想我知道答案原因。当你调用一个函数时,内存中有额外的工作用于推送堆栈和弹出堆栈。当您使用! (NOT operator)时,无需在内存中为 push/pop 堆栈创建额外的工作。这就是 NOT 运算符工作得更快的原因。

于 2020-02-27T06:49:25.750 回答