【发布时间】:2019-07-11 06:23:58
【问题描述】:
所以在 JavaScript 中我们有三个相等比较运算符。我一直在阅读 ECMAScript 规范并研究它们是如何工作的。有什么东西打动了我。 Object.is() 内置函数的比较步骤更少,并且比其他运算符更早终止。那么这是否使Object.is() 的运行速度比其他运算符更快?
这里是sn-ps的规范:
Object.is()
- 如果 Type(x) 与 Type(y) 不同,则返回 false。
如果 Type(x) 是数字,那么
一个。如果 x 是 NaN 而 y 是 NaN,则返回 true。
b.如果 x 为 +0 且 y 为 -0,则返回 false。
c。如果 x 是 -0 并且 y 是 +0,返回假。
d。如果 x 与 y 的数值相同,则返回 true。
e。返回 false。
- 返回 SameValueNonNumber(x, y)。
松散等于==
比较 x == y,其中 x 和 y 是值,产生 true 或 错误的。这样的比较是这样进行的:
如果 Type(x) 与 Type(y) 相同,那么
一个。返回执行严格等式比较的结果 x === y。
- 如果 x 为 null 而 y 未定义,则返回 true。
- 如果 x 未定义且 y 为 null,则返回 true。
- 如果 Type(x) 是 Number 并且 Type(y) 是 String,则返回比较结果 x == ! ToNumber(y)。
- 如果Type(x) 是String,Type(y) 是Number,返回比较结果! ToNumber(x) == y。
- 如果 Type(x) 是布尔值,则返回比较结果! ToNumber(x) == y。
- 如果 Type(y) 是 Boolean,则返回比较结果 x == ! ToNumber(y)。
- 如果 Type(x) 是字符串、数字或符号且 Type(y) 是 Object,则返回比较结果 x == ToPrimitive(y)。
- 如果 Type(x) 是 Object 并且 Type(y) 是 String、Number 或 Symbol,则返回 ToPrimitive(x) == y 的比较结果。
- 返回 false。
严格等于 ===
比较 x === y,其中 x 和 y 是值,产生 true 或 错误的。这样的比较是这样进行的:
如果 Type(x) 与 Type(y) 不同,则返回 false。
如果 Type(x) 是数字,那么
一个。如果 x 是 NaN,则返回 false。
b.如果 y 是 NaN,则返回 false。
c。如果 x 与 y 的数值相同,则返回 true。
d。如果 x 为 +0 且 y 为 -0,则返回 true。
e。如果 x 为 -0 且 y 为 +0,则返回 true。
f。返回 false。
返回 SameValueNonNumber(x, y)。
如果从事 JavaScript 编译器工作的人可以回答这个问题,那就太好了!
【问题讨论】:
-
最好的检查方法是通过测试。请参阅来自 jsPerf 的 this。根据这些测试,
Object.is在所有情况下确实更快。 -
@YongQuan 这不能将
Object.is与===进行比较。它将Object.is与一个函数调用进行比较,其中包含一个条件,可能还有几个相等性检查和几个除法 -
@Paulpro 只是在网上找到另一个 jsPerf 测试。我上次搜索时有很多。您甚至可以编写自己的测试。
-
所有对您的实施真正重要的性能问题都应该通过实际测试来解决。定义一些与您的特定代码相关的测试用例,并设计一个比较它们的 jsperf。看看哪种方式更快。尝试几个 JS 引擎,因为性能可能会有所不同。大多数情况下,实际代码中的差异可能毫无意义,但如果您真的很好奇,那么请设计一个代表您真正关心和衡量的测试用例的测试。猜想===猜测。测量 === 事实。
-
请注意,
===的第 2 步是标准的 IEEE 比较,因此可能有它的单指令版本。另一方面,Object.is的第 2a 步是比较两个集合(因为NaN有多个表示但它们都被视为等效),因此直接按位比较可能不够。