在JavaScript中,使用双等号(==
)和三等号(===
)是否会对性能产生影响?
例如:if (foo == bar)
和if (foo === bar)
的区别。
在JavaScript中,使用双等号(==
)和三等号(===
)是否会对性能产生影响?
例如:if (foo == bar)
和if (foo === bar)
的区别。
如果比较的类型相同,它们就是完全相同的。也就是说,它们使用完全相同的算法。
如果类型不同,则性能无关紧要。你需要类型强制转换,或者不需要。如果不需要,不要使用==
,因为你得到的结果可能出乎意料。
严格比较符 (===
) 总体上始终会稍微快一些,但 差异通常是可以忽略不计的。
如果您确定比较中不需要类型转换,那么优先选择 ===
是有意义的。它始终至少和 ==
一样快。
==
在FF7上两次测试中都比===
快。我同意===
应该更快,但测试结果表明相反(可能是JavaScript引擎/ CPU负载方面的差异,谁知道呢)。 - Nightfirecat==
和===
被指定为执行完全相同的步骤。 - Tim Downx =''; y = 0; (x == y)
执行类型转换,导致减速。如果您知道类型可能不同,并且非常关注性能,则使用 === 可能会更快一些。(但是如果您自己进行类型转换,则显然不会有性能提升。) - Drakinite编辑: 参考以下由Axel Rauschmayer博士提供的按规范解释 http://www.2ality.com/2011/06/javascript-equality.html 真的很好的写作。
===
(严格相等):仅认为具有相同类型的值相等。
==
(宽松相等)
==
通过将给定变量转换为基元(字符串、数字、布尔值)来测试相似性。===
测试严格的相同性,这意味着确切相同的对象或基元值而不进行转换。objOne == objTwo
,实际发生的是[[EQUALS]].call(objOne.valueOf(), objTwo.valueOf())
valueOf的解析可能有些复杂,会在JS中公开的函数和内部引擎之间反弹。可以说,比较将始终以两个值被强制转换为基元或抛出错误结束。
编辑:EQUALS
实际上首先尝试STRICT_EQUALS
,这会预先处理其余过程。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中唯一不可变的东西。
==
和===
被指定为完全相同的工作方式,所以我不相信JS环境会在这种情况下实现它们不同。 - Tim DownvalueOf()
自ECMAScript 1(1997年)以来就存在,因此并不新颖。您没有回答我的观点,即当两个操作数类型相同时会发生什么。将operator == {}
和operator === {}
添加到您的示例中,您会发现它们都没有出现在您的actions
数组中。 - Tim Down===
比较操作符才更快。 - Tim Down由于性能方面的考虑,我认为 ===
比 ==
更具优势,因为 ===
比 ==
更加严格。
例如在 Chrome 控制台中尝试以下代码:
> 1 == '1'
true
> 1 === '1'
false
< p > < code > == 需要检查的内容比 < code > === 更多。 < /p >
从一些脆弱的测试来看,==
似乎比===
稍微快一点。
稍微快一点,我的意思是在执行数百万次测试的迭代中可以看到几毫秒的差异。你不可能需要性能提升,而是使用最适合手头任务的方法。
编辑:实际上,这似乎取决于你正在比较什么以及浏览器的实现。换句话说,不要担心它。
===
在大多数情况下更快。虽然有些例外情况(你找到了一个),但是从代码实践/风格指南的角度来看,每次都应该选择 ===
。 - Raynos这取决于被比较的项目。由于 "===" 比 "==" 更严格,所以它应该比 "==" 更快地返回 false。然而,如果两个项目严格相等,"===" 应该比 "==" 花费更多时间,因为它必须检查更多的属性是否相等。
===
比==
快0.0027%。即使差异真的那么大,也比眨眼或普通人大脑反应对普通刺激所需的时间快约10,000倍。为了支持“轻盈环绕比赛”的评论,我想不出有哪种情况下可能会在两者之间注意到速度差异。 - GreenRaccoon23