所以在JavaScript中,我们有三个相等比较运算符。我一直在阅读 ECMAScript 规范并研究它们是如何工作的。有些东西打动了我。与其他运算符相比,Object.is()
内置函数的比较步骤更少,并且提前终止的机会更大。那么,这是否使Object.is()
比其他运营商运行得更快?
以下是规范片段:
Object.is()
- 如果 Type(x) 与 Type(y) 不同,则返回 false。
如果 Type(x) 是数字,则
一个。如果 x 是 NaN,y 是 NaN,则返回 true。
二.如果 x 为 +0,y 为 -0,则返回 false。
三.如果 x 为 -0 且 y 为 +0,返回假。
d.如果 x 与 y 的数值相同,则返回 true。
e. 返回假值。
- 返回 SameValueNonNumber(x, y)。
松散等于 ==
比较 x == y,其中 x 和 y 是值,产生 true 或 假。此类比较按如下方式执行:
如果 Type(x) 与 Type(y) 相同,则
a. 返回执行严格相等比较的结果 x === y。
- 如果 x 为空且 y 未定义,则返回 true。
- 如果 x 未定义且 y 为空,则返回 true。
- 如果 Type(x) 是数字,Type(y) 是字符串,则返回比较结果 x == !ToNumber(y)。
- 如果 Type(x) 是字符串,Type(y) 是数字,则返回比较结果!ToNumber(x) == y.
- 如果 Type(x) 是布尔值,则返回比较结果!ToNumber(x) == y.
- 如果 Type(y) 是布尔值,则返回比较结果 x == !ToNumber(y)。
- 如果 Type(x) 是字符串、数字或符号,而 Type(y) 是对象,则返回比较结果 x == ToPrimitive(y)。
- 如果 Type(x) 是 Object 且 Type(y) 是 String、Numbers 或 Symbol,则返回比较 ToPrimitive(x) == y 的结果。
- 返回假。
严格等于 ===
比较 x === y,其中 x 和 y 是值,产生 true 或 假。此类比较按如下方式执行:
如果 Type(x) 与 Type(y) 不同,则返回 false。
如果 Type(x) 是数字,则
一个。如果 x 是 NaN,则返回 false。
二.如果 y 是 NaN,则返回 false。
三.如果 x 与 y 的数值相同,则返回 true。
d.如果 x 为 +0,y 为 -0,则返回 true。
e.如果 x 为 -0,y 为 +0,则返回 true。
f. 返回假数。
返回 SameValueNonNumber(x, y)。
如果从事JavaScript编译器工作的人可以回答这个问题,那就太好了!
规范中的步骤越少并不一定意味着实现中的步骤越少。各种优化都适用于此处。所以最后,我们所能做的就是真正赛马!(在您的实际用例中,某些合成while(true) Object.is(1, 1);
不会产生任何有用的结果)。如果它真的(显着)更快,它是否使您的代码更好,例如
Object.is(user.age, 3)
比更清晰
user.age === 3
?