ECMAScript 仕様によると、単項論理 NOT 演算子( !
) と関数の両方が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);
注:私はnew Boolean()
コンストラクターについて言及しているのではなくBoolean()
、ブール値に与えられた引数を強制する関数について言及しています。