在 JavaScript 中,使用双等号 ( ==
) 与使用三等号 ( )之间是否存在性能差异===
?
示例:if (foo == bar)
vsif (foo === bar)
在 JavaScript 中,使用双等号 ( ==
) 与使用三等号 ( )之间是否存在性能差异===
?
示例:if (foo == bar)
vsif (foo === bar)
如果比较的类型相同,则它们是相同的。也就是说它们使用完全相同的算法。
如果类型不同,则性能无关紧要。您要么需要类型强制,要么不需要。如果您不需要它,请不要使用,==
因为您得到的结果可能出乎意料。
严格比较 ( ===
) 总是会稍微快一点,但差异通常可以忽略不计。
===
如果您确定在比较中不需要类型强制,那么优先选择绝对是有意义的。它总是至少和 一样快==
。
编辑:供参考,这里是Axel Rauschmayer 博士的规范解释http://www.2ality.com/2011/06/javascript-equality.html 写得真好 。
===
(严格相等):只考虑相同类型的值相等。
==
(宽大平等)
在所有现代 Javascript 环境中,它们的实现方式完全不同。简单来说,==
通过将给定的变量转换为基元(字符串、数字、布尔值)来测试相似性。===
严格相同性测试,这意味着完全相同的对象或原始值无需转换。
如果你做
objOne == objTwo
实际发生的事情是
[[EQUALS]].call(objOne.valueOf(), objTwo.valueOf())
valueOf 的解析可能有点涉及,在 JS 中公开的函数和内部引擎的东西之间跳来跳去。可以说比较总是以两个强制为原始值的值结束,否则会抛出错误。
编辑: EQUALS
实际上STRICT_EQUALS
首先尝试抢占过程的其余部分。
这里有趣的一点是 valueOf(及其伙伴 toString)是可覆盖的。在 Chrome 中运行这段代码(我认为任何 webkit,不确定 JSC 和 V8 是否共享此花絮)。它会让你大吃一惊:
var actions = [];
var overload = {
valueOf: function(){
var caller = arguments.callee.caller;
actions.push({
operation: caller.name,
left: caller.arguments[0] === this ? "unknown" : this,
right: caller.arguments[0]
});
return Object.prototype.toString.call(this);
}
};
overload.toString = overload.valueOf;
overload == 10;
overload === 10;
overload * 10;
10 / overload;
overload in window;
-overload;
+overload;
overload < 5;
overload > 5;
[][overload];
overload == overload;
console.log(actions);
输出:
[ { operation: 'EQUALS',
left: overload,
right: 10 },
{ operation: 'MUL',
left: overload,
right: 10 },
{ operation: 'DIV',
left: 'unknown',
right: overload },
{ operation: 'IN',
left: overload,
right: DOMWindow },
{ operation: 'UNARY_MINUS',
left: overload,
right: undefined },
{ operation: 'TO_NUMBER',
left: overload,
right: undefined },
{ operation: 'COMPARE',
left: overload,
right: 5 },
{ operation: 'COMPARE',
left: 'unknown',
right: overload },
{ operation: 'ToString',
left: 'unknown',
right: overload } ]
==
和之间差异的本质===
通过===
未出现在该列表中来说明。它完全跳过了进入 JavascriptLand 的过程。在比较性能时,这种冒险是昂贵的。
但是,您需要考虑引擎优化。对于大多数对象,引擎将能够省去大部分步骤并留在 NativeLand 中并获得几乎相同的性能。但这并不能保证,如果某些因素阻止引擎使用优化、代码中的某些花哨或覆盖内置函数或无数问题,那么您会立即看到性能方面的结果。===
强迫它。
===
几乎是 Javascript 中唯一不可变的东西。
由于性能,我认为===
具有更好的性能,因为===
比 更严格==
,
例如,在 Chrome 控制台中尝试以下操作。
> 1 == '1'
true
> 1 === '1'
false
==
必须检查比 ===
从一些脆弱的测试来看,==
似乎比===
.
稍微说一下,我的意思是我可以在数百万次测试的交互中看到几毫秒的差异。您不可能需要性能提升,而不是使用最适合手头任务的方法。
编辑:实际上,似乎取决于您正在比较的 /what/ 和浏览器实现。换句话说,不要担心。