Сяоюнь — программист, который еще не потерял волосы, и недавно, увидев, что популярность 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.
использованная литература
Друзья, которым понравилась эта статья, прошу обратить внимание на мой номер подпискилюблю набирать код, узнать больше.