为啥 === 在 JavaScript 中比 == 快? [关闭]
Posted
技术标签:
【中文标题】为啥 === 在 JavaScript 中比 == 快? [关闭]【英文标题】:Why === faster than == in JavaScript? [closed]为什么 === 在 JavaScript 中比 == 快? [关闭] 【发布时间】:2013-10-03 05:32:12 【问题描述】:查看这些测试:
== vs ====
== vs ===
【问题讨论】:
因为它不需要进行类型转换,所以它可以更快地知道条件是真还是假。 您发布的链接并不真正支持您的说法。结果表明,在大多数浏览器上它们是相对等价的,少数显示 == 更快,少数显示 === 更快。 因为比搜索更容易询问***.com/questions/12374815/…***.com/questions/359494/…***.com/questions/10259774/…***.com/questions/12332855/…***.com/questions/3900575/… 与问题无关,但 JS 性能跨浏览器是如此不一致。不仅如此,它还经常违背常识,例如正则表达式解析字符串比对每个字符解析一个简单字符更快,这主要是因为一些本地方法是用 C 编写的,执行速度更快。这非常烦人。 性能差异是微不足道的,浏览器的实现方式也不同。这些测试不可能反映现实世界的应用。我只是在有意义的时候使用==
和===
。
【参考方案1】:
这是 javascript 必须为 ===
做的事情:
-
如果 Type(x) 与 Type(y) 不同,则返回 false。
如果 Type(x) 未定义,则返回 true。
如果 Type(x) 为 Null,则返回 true。
如果类型(x)是数字,那么
-
如果 x 为 NaN,则返回 false。
如果 y 是 NaN,则返回 false。
如果 x 与 y 的数值相同,则返回 true。
如果 x 为 +0 且 y 为 -0,则返回 true。
如果 x 为 -0 且 y 为 +0,则返回 true。
返回 false。
这就是它必须为==
做的事情:
-
如果 Type(x) 与 Type(y) 相同,则
-
如果 Type(x) 未定义,则返回 true。
如果 Type(x) 为 Null,则返回 true。
如果类型(x)是数字,那么
-
如果 x 为 NaN,则返回 false。
如果 y 是 NaN,则返回 false。
如果 x 与 y 的数值相同,则返回 true。
如果 x 为 +0 且 y 为 -0,则返回 true。
如果 x 为 -0 且 y 为 +0,则返回 true。
返回 false。
请注意,如果Type(x)
等于Type(y)
,那么操作员会做同样的事情。但是,如果不是,那么 ==
可能需要进行各种转换,而 ===
只会返回 false。
对于您提供的链接,正在比较的类型实际上是相同的,因此两个运算符的性能应该大致相同。这里的差异将基于实现细节——因为它们做不同的事情,它们可以针对不同的方式进行优化。从理论上讲,由于===
做得更少,人们会认为它总是会更快,但对于某些版本的 Firefox 似乎并非如此,至少如果这些基准是准确的。
但是,see the difference if the types are different。在执行"hi" ===
时,您每秒可获得约 6600 万次操作,但对于 "hi" ==
,您每秒只有约 400 万次操作。
【讨论】:
我不认为这是问题 “==
与 ===
相比有许多额外的步骤...” 不一定。仅当类型不同时才会如此。
@captain 问题是什么?
@plalx 的问题是关于性能的。
@captain,我认为规范不言自明为什么==
可能比===
慢。【参考方案2】:
JavaScript 是一种弱类型语言,因此它会尽可能应用类型强制。
等号运算符
// These are true
new Number(10) == 10; // Number.toString() is converted
// back to a number
10 == '10'; // Strings gets converted to Number
10 == '+10 '; // More string madness
10 == '010'; // And more
isNaN(null) == false; // null converts to 0
// which of course is not NaN
严格等式运算符
它的工作方式与普通的相等运算符类似,只是严格相等运算符不在其操作数之间执行类型强制。
"" === "0" // false
0 === "" // false
0 === "0" // false
false === "false" // false
false === "0" // false
false === undefined // false
false === null // false
null === undefined // false
" \t\r\n" === 0 // false
上面的结果更加清晰,并且允许早期破坏代码。 这在一定程度上强化了代码,并且在操作数属于不同类型的情况下也提高了性能。
所以 === 比 JavaScript 中的 == 快
这里很好Reference
【讨论】:
【参考方案3】:=== 比较值和类型是否相同。 == 比较值是否相同,但它也在比较中进行类型转换。这些类型转换使 == 比 === 慢。
【讨论】:
以上是关于为啥 === 在 JavaScript 中比 == 快? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
为啥 ''.join() 在 Python 中比 += 快?
为啥 DISTINCT 在 Pig 中比 GROUP BY/FOREACH 快
为啥相同的代码在我的 BackGroundWorker 线程中比在我的 GUI 线程中慢得多?