Возможно, это то знание, которое вы упустили при изучении ES7.

внешний интерфейс алгоритм программист JavaScript

Сяоюнь — программист, который еще не потерял волосы, и недавно, увидев, что популярность ES настолько высока, он решил воспользоваться этим.

Что нового в ES7

  • Array.prototype.includes
  • **

**

Сяоюнь впервые увидела нового оператора ** в ES7 и втайне обрадовалась: так просто?

  8 ** 3 // 512
  Math.pow(8, 3) // 512

Но Сяоюнь любит возиться, поэтому он набрал следующий код:

  2 ** 2 ** 0 // 2

Результат оказался 2. Сяоюнь с сомнением проверил информацию, оказалось, что оператор ** правоассоциативен:

  (2 ** 2) ** 0 // 1

Сяоюнь, наконец, получил ожидаемый результат, а также обнаружил, что за основанием не может следовать унарный оператор, даже +.

Array.prototype.includes

Совет: Почему этот метод не содержит? потому что некоторыеBug, он был переименован в включает

Затем Сяоюнь начал изучать метод include:

  [1, 2, 1].includes(1) // true

Сяоюнь набрал код, который использовался для определения того, существовал ли элемент в массиве раньше:

  if ([1, 2, 1].indexOf(1) !== -1) {
    // true
  }

Ух ты! Наконец-то избавился от этого противного !== -1.

Отличаются ли эти два метода только возвращаемым значением? На этот раз Сяоюнь решил перестать бездельничать и двигаться прямо.ES7 Документация.

Через несколько часов Сяоюнь собирается начать свое выступление.

Стандартный алгоритм сравнения равенства ES

  • The Abstract Equality Comparison Algorithm (==)
  • The Strict Equality Comparison Algorithm (===)
  • SameValue (Object.is())
  • SameValueZero (API еще не предоставлен)

С первыми двумя знакомы все, когда я впервые изучал JS, я просто использовал свой многолетний накопленный опыт, чтобы различить разницу между ними:

  [1, 2, 3] == '1,2,3' // true
  ['1'] == 1 // true

Так что я поражен вышеописанной ситуацией, но после понимания принципа все становится так просто.

The Abstract Equality Comparison Algorithm

  • Особенностью является NaN, -0, 0, когда типы одинаковы.
  NaN == NaN // false
  -0 == 0 // true
  • Когда типы разные, первое правило таково: null равно undefined
  • Когда типы разные, второе правило: все сравнения в конечном итоге будут преобразованы в числовые сравнения, а приоритет их преобразования — Boolean => Object => String

Первые два понять несложно, в процессе сравнения ['1'] == true ознакомьтесь с третьим правилом:

  • Преобразуйте логический тип справа в числовой тип, преобразуйте его в ['1'] == 1
  • Преобразуйте тип объекта слева в примитивное значение и преобразуйте его в «1» == 1
  • Преобразуйте тип String слева в числовой тип, преобразуйте его в 1 == 1

Тогда вы столкнетесь:

  [] == false // true

Легко ли узнать результат?

The Strict Equality Comparison Algorithm

Что следует отметить в этом алгоритме, так это сравнение типа Number:

  NaN === NaN // false
  -0 === 0 // true

Подсказка. Анализ приведенных выше методов в основном основан на ES5.1, и в ES6 есть небольшие изменения, такие как добавление сравнения символов.

SameValue

Для тех, кто умеет пользоваться ES6, узнайте больше о методе Object.is():

  Object.is(NaN, NaN) // true
  Object.is(0, -0) // false

Алгоритм сравнения, используемый внутри Object.is, называется SameValue(x, y), и разница между ним и === как раз в этих двух случаях.

SameValueZero

Но есть ли у вас сомнения по поводу этой ситуации при использовании es6:

  const s = new Set()
  s.add(0)
  s.add(NaN)
  s.has(-0) // true
  s.has(NaN) // true

Отличается ли он от производительности трех вышеупомянутых алгоритмов?Это четвертый алгоритм сравнения SameValueZero, который отличается от SameValue главным образом тем, что 0 и -0 равны.

Итак, когда вы практикуете метод include, вы сталкиваетесь:

  const a = [0, NaN]
  a.includes(-0) // true
  a.includes(NaN) // true

Никакой суеты, потому что алгоритм сравнения, используемый внутренне, — это SameValueZero.

использованная литература


Друзья, которым понравилась эта статья, прошу обратить внимание на мой номер подпискилюблю набирать код, узнать больше.