根据ECMAScript规范,一元逻辑非运算符 (
我使用了下面的代码来测试哪个更快:
!
)和Boolean()
函数 都使用内部函数 ToBoolean()
,而逻辑非运算符还进行了一些检查以反转结果。那么为什么双重逻辑非操作比运行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()
函数。
Boolean()
每次调用都需要创建一个新的执行上下文,而!!true
则不需要;我猜这就是花费大量时间的地方。 - MattBoolean()
,当然不是new Boolean
。 - Qantas 94 HeavyBoolean()
比!!
更快了。在两个不同的设备上尝试了 Chrome 86。 - Andriy Buday