双等于(==)和三等于(==)之间的JavaScript性能差异
在JavaScript中,使用双等于(双等于(==)和三等于(==)之间的JavaScript性能差异,javascript,node.js,performance,browser,comparison,Javascript,Node.js,Performance,Browser,Comparison,在JavaScript中,使用双等于(==)与使用三等于(==)之间是否存在性能差异 例如:if(foo==bar)vsif(foo==bar)由于性能原因,我认为==的性能更好,因为==比=更严格 e、 g.在Chrome控制台中尝试以下操作 > 1 == '1' true > 1 === '1' false =必须检查比==更多的东西严格的比较(==)总是稍微快一点,但是 如果您确定在比较中不需要类型强制,那么选择==显然是有意义的。从一些不可靠的测试来看,=似乎比=稍
==
)与使用三等于(==
)之间是否存在性能差异
例如:
if(foo==bar)
vsif(foo==bar)
由于性能原因,我认为==
的性能更好,因为==
比=
更严格
e、 g.在Chrome控制台中尝试以下操作
> 1 == '1'
true
> 1 === '1'
false
=
必须检查比==
更多的东西严格的比较(==
)总是稍微快一点,但是
如果您确定在比较中不需要类型强制,那么选择
==
显然是有意义的。从一些不可靠的测试来看,=
似乎比=
稍微快一些
我的意思是,我可以在数百万次测试的迭代中看到几毫秒的差异。您不可能需要性能增益,而不是使用最适合手头任务的东西
编辑:实际上,这似乎取决于/您正在比较的内容/以及浏览器实现。换句话说,别担心。- 如果比较的类型相同,它们是相同的。也就是说,他们使用了完全相同的算法
- 如果类型不同,则性能无关。要么需要类型强制,要么不需要。如果您不需要它,不要使用
,因为您得到的结果可能是意外的=
=
(严格相等):仅考虑具有相同类型的值相等
=
(宽大平等)
=
通过将给定变量转换为原语(字符串、数字、布尔值)来测试有效性<代码>=测试严格的相同性,这意味着完全相同的对象或原语值,无需转换
如果你这样做
objOne==objTwo
实际发生的是
[[EQUALS]].调用(objOne.valueOf(),objTwo.valueOf())
valueOf的解析可能有些复杂,在JS中公开的函数和内部引擎之间跳跃。只需说,比较总是以两个强制为原语的值结束,否则将抛出一个错误
Edit: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);
==
和==
之间差异的本质可以通过该列表中未显示的==
来说明。它完全跳过了进入JavascriptLand的旅程。当比较性能时,这种冒险是昂贵的
但是,您需要考虑引擎优化。对于大多数对象,引擎将能够省去大部分步骤并保持在NativeLand中,并获得几乎相同的性能。但这并不是一个保证,如果有什么东西阻止引擎使用优化、代码中的某些幻想或重写内置或大量问题,那么您会立即看到性能方面的结果<代码>=强制它
=
几乎是Javascript中唯一不变的东西。它取决于要比较的项目。因为“==”比“==”更严格,所以它应该比“==”更快地返回false。但是,如果这两项严格相等,则“==”应该比“==”花费更多的时间,因为它必须检查更多的属性是否相等。您永远不会注意到任何事情。继续前进。它们有不同的用途,“更高的性能”不在其中。这不是问题,当你想获得它们提供的功能时使用它们。推荐阅读:因为这仍然是这个问题的谷歌排名第一的结果,而且我没有看到任何测试结果,我将添加一个。运行4次的Node.js小测试的平均结果(2个操作符中的每个操作符总共测试800000000次)发现==
比=
快0.0027%。如果差异真的那么大的话,那么它比眨眼或人脑对平均刺激作出反应的时间快10000倍左右。为了支持轨道上的轻量级比赛,我想不出任何一种情况下,人类可能会注意到两者之间的速度差异。@Jonsurll感谢有趣的链接:)五年后,很有趣,因为我在FF7上进行了两次测试。我同意==
应该更快一些,但测试表明不是这样。(可能是Javascript引擎/CPU负载的差异,谁知道呢)@Nightfirecat:这很有趣。你是在比较变量还是文字?我只是在使用它使用的默认测试,即“==/==仅在同一类型上”测试,因为这些是faste测试
[ { 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 } ]