Является ли Object.is (x, y) быстрее, чем другие сравнения? - PullRequest
3 голосов
/ 11 июля 2019

Итак, в JavaScript у нас есть три оператора сравнения равенства.Я читал спецификацию ECMAScript и смотрел, как они работают.Что-то поразило меня.Встроенная функция Object.is() имеет меньше шагов для сравнения, и у нее больше шансов завершиться раньше, чем у других операторов.Так значит ли это, что Object.is() функционирует быстрее, чем другие операторы?

Вот фрагменты спецификации:

Object.is ()

  1. Если тип (x) отличается от типа (y), вернуть false.
  2. Если тип (x) равен Number, то

    a.Если x равен NaN, а y равен NaN, вернуть true.

    b.Если x равен +0, а y равен -0, вернуть false.

    с.Если x равен -0, а y равен +0, вернуть false.

    d.Если x - это то же самое числовое значение, что и y, вернуть true.

    е.Вернуть false.

  3. Вернуть SameValueNonNumber (x, y).

Свободные равны ==

Сравнение x == y, где x и y являются значениями, дает истину или ложь.Такое сравнение выполняется следующим образом:

  1. Если тип (x) совпадает с типом (y), то

    a.Вернуть результат выполнения строгого сравнения равенства x === y.

  2. Если x равен нулю, а y не определен, вернуть true.
  3. Если x не определен, а y равен нулю,верните true.
  4. Если Type (x) равен Number, а Type (y) равен String, вернуть результат сравнения x ==!ToNumber (y).
  5. Если Type (x) равен String, а Type (y) равен Number, вернуть результат сравнения!ToNumber (x) == y.
  6. Если Type (x) - логическое значение, вернуть результат сравнения!ToNumber (x) == y.
  7. Если тип (y) - логическое значение, вернуть результат сравнения x ==!ToNumber (y).
  8. Если для Type (x) задано либо String, Number, либо Symbol, а для Type (y) - Object, вернуть результат сравнения x == ToPrimitive (y).
  9. Если тип (x) равен объекту, а тип (y) равен либо строке, числу, либо символу, вернуть результат сравнения. ToPrimitive (x) == y.
  10. вернуть значение false.

Строгое равно ===

Сравнение x === y, где x и y - значения, дает значения true или false.Такое сравнение выполняется следующим образом:

  1. Если тип (x) отличается от типа (y), вернуть false.

  2. Если тип(х) - это число, затем

    а.Если x равен NaN, вернуть false.

    б.Если y равен NaN, вернуть false.

    c.Если x - это то же числовое значение, что и y, вернуть true.

    d.Если x равен +0, а y равен -0, верните true.

    e.Если x равен -0, а y равен +0, верните true.

    f.Вернуть false.

  3. Вернуть SameValueNonNumber (x, y).

1 Ответ

2 голосов
/ 11 июля 2019

Меньшее количество шагов в спецификации не обязательно означает меньшее количество шагов в реализации. Все виды оптимизации применяются здесь. Таким образом, в конце концов, все, что мы можем сделать, это на самом деле мчаться на лошадях! (в вашем реальном мире использования синтетический while(true) Object.is(1, 1); не даст никаких полезных результатов). Если это действительно (особенно) быстрее, делает ли это ваш код лучше, например есть

      Object.is(user.age, 3)

яснее, чем

      user.age === 3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...