Object.is(x,y) 比其他比较快吗?



所以在JavaScript中,我们有三个相等比较运算符。我一直在阅读 ECMAScript 规范并研究它们是如何工作的。有些东西打动了我。与其他运算符相比,Object.is()内置函数的比较步骤更少,并且提前终止的机会更大。那么,这是否使Object.is()比其他运营商运行得更快?

以下是规范片段:

Object.is()

  1. 如果 Type(x) 与 Type(y) 不同,则返回 false。
  2. 如果 Type(x) 是数字,则

    一个。如果 x 是 NaN,y 是 NaN,则返回 true。

    二.如果 x 为 +0,y 为 -0,则返回 false。

    三.如果 x 为 -0 且 y 为 +0,返回假。

    d.如果 x 与 y 的数值相同,则返回 true。

    e. 返回假值。

  3. 返回 SameValueNonNumber(x, y)。

松散等于 ==

比较 x == y,其中 x 和 y 是值,产生 true 或 假。此类比较按如下方式执行:

  1. 如果 Type(x) 与 Type(y) 相同,则

    a. 返回执行严格相等比较的结果 x === y。

  2. 如果 x 为空且 y 未定义,则返回 true。
  3. 如果 x 未定义且 y 为空,则返回 true。
  4. 如果 Type(x) 是数字,Type(y) 是字符串,则返回比较结果 x == !ToNumber(y)。
  5. 如果 Type(x) 是字符串,Type(y) 是数字,则返回比较结果!ToNumber(x) == y.
  6. 如果 Type(x) 是布尔值,则返回比较结果!ToNumber(x) == y.
  7. 如果 Type(y) 是布尔值,则返回比较结果 x == !ToNumber(y)。
  8. 如果 Type(x) 是字符串、数字或符号,而 Type(y) 是对象,则返回比较结果 x == ToPrimitive(y)。
  9. 如果 Type(x) 是 Object 且 Type(y) 是 String、Numbers 或 Symbol,则返回比较 ToPrimitive(x) == y 的结果。
  10. 返回假。

严格等于 ===

比较 x === y,其中 x 和 y 是值,产生 true 或 假。此类比较按如下方式执行:

  1. 如果 Type(x) 与 Type(y) 不同,则返回 false。

  2. 如果 Type(x) 是数字,则

    一个。如果 x 是 NaN,则返回 false。

    二.如果 y 是 NaN,则返回 false。

    三.如果 x 与 y 的数值相同,则返回 true。

    d.如果 x 为 +0,y 为 -0,则返回 true。

    e.如果 x 为 -0,y 为 +0,则返回 true。

    f. 返回假数。

  3. 返回 SameValueNonNumber(x, y)。

如果从事JavaScript编译器工作的人可以回答这个问题,那就太好了!

规范中的步骤越少并不一定意味着实现中的步骤越少。各种优化都适用于此处。所以最后,我们所能做的就是真正赛马!(在您的实际用例中,某些合成while(true) Object.is(1, 1);不会产生任何有用的结果)。如果它真的(显着)更快,它是否使您的代码更好,例如

Object.is(user.age, 3)

比更清晰

user.age === 3

最新更新