根据 ECMAScript 规范,两者一元逻辑 NOT 运算符 http://www.ecma-international.org/ecma-262/5.1/#sec-11.4.9 (!
) and the Boolean()功能 http://www.ecma-international.org/ecma-262/5.1/#sec-15.6.1 use 内部函数ToBoolean() http://www.ecma-international.org/ecma-262/5.1/#sec-9.2,并且 NOT 运算符还执行一些检查来反转结果。那么为什么是双逻辑非运算快多了 http://jsperf.com/boolean-vs-double-negation比运行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);
Note:我指的不是new Boolean()
构造函数,但是Boolean()
将赋予它的参数强制为布尔值的函数。
While Boolean
将调用该函数(内部优化),大多数 JIT 会内联双精度而不使用 XOR,这要快得多(源码参考 http://hg.mozilla.org/integration/mozilla-inbound/file/7c905a200bcc/js/src/methodjit/FastOps.cpp#l768- JägerMonkey)。
还有 JSperf:http://jsperf.com/bool-vs-doublenot http://jsperf.com/bool-vs-doublenot
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)