Давайте покатаемся на каком-нибудь WTF с массивами JavaScript.

[] == ![]
Это происходит из-за precedence и coercion.
Дополнительное примечание - Приоритет определяет порядок, в котором выполняются операторы. Чем выше приоритет, тем раньше будет выполнена операция. Например, * имеет более высокий приоритет, чем оператор +. Что касается принуждения, это способность JS преобразовать один из операндов (оператора) в «эквивалентное» значение другого операнда. Это происходит, когда типы операндов различаются. Например, для boolean == integer операнд boolean будет преобразован в integer.
Благодаря precedence JS выполняет сначала операцию ![], а затем ==.
Операция логическое НЕ ![] отрицает истинность [] и возвращает логическое значение false. По шагу за шагом:
- Вычислите выражение
[]; - Преобразуйте результат в логическое значение, например
ToBoolean([]). По определению результатtrue; - Вернуть
false, что является логическим отрицаниемtrue;
Мы получили
[] == false.
Теперь в игру вступает coercion.
Поскольку наш второй операнд является логическим, операция переводится в [] == ToNumber(false). ToNumber логического значения возвращает 1, когда true, или 0, когда false (см. Спецификацию).
У нас есть
[] == 0.
По спецификации [] == 0 переводится в ToPrimitive([]) == 0, что, в свою очередь, приводит к операции OrdinaryToPrimitive([], "number") == 0.
OrdinaryToPrimitive для параметров Object и "number" запускает оба метода .valueOf() и .toString() Object и возвращает результат, который не является объектом. В нашем случае, поскольку [].valueOf() возвращает объект (т. Е. []), вместо этого возвращается результат [].toString() (т. Е. "").
У нас есть
"" == 0.
Терпение. Мы почти у цели 😅
Теперь, когда первый операнд представляет собой строку, наша операция переводится в ToNumber("") == 0. По определению пустая строка преобразуется в 0.
У нас есть
0 == 0.
Это true 🎉
Вот так!

Примечание. Я подробно остановился на этом первом WTF, чтобы вы знали, насколько удобен JS. А пока я постараюсь быть более кратким.
.подать заявление()
Эта «функция» предоставлена вам ECMAScript 5th Edition.
Начиная с ES5, мы можем вызывать Function.prototype.apply() с любым подобным массиву объектом. Это означает, что второй аргумент apply() (см. Определение) должен иметь свойство length и целочисленные свойства в диапазоне 0…length — 1.
Например, массив [6,8] имеет длину свойства 2 и целочисленные свойства из 0…1 (то есть [6,8][0] и [6,8][1].) Итак, это объект, подобный массиву (это простое объяснение, подробности вы можете прочитать здесь.)
Поскольку все 4 примера являются объектами массива со свойством length, apply() выполнит функцию Array с каждым значением из 0…length — 1 в качестве аргументов. .
Для примера {length: 3} он имеет length 3, и apply() выполнит Array следующим образом:
.Сортировать()
Это не WTF.
Вот как работает sort(). Но мы все равно можем повеселиться 😃
Согласно спецификации sort() сортирует элементы массива в соответствии с их строковым значением Unicode.
Поскольку значение Unicode для первого символа 10 (т. Е. 1) ниже, чем значение Unicode для символа 2, 10 появляется перед 2 при «сортировке».

Мне сейчас смешно!
🔥 .slice ()
Все вы можете вспомнить нашего друга slice(), который, согласно его спецификации, принимает два аргумента, start и end, и возвращает массив, содержащий элементы массива от элемента start до end ( end не входит .)
синтаксис
array.slice (начало, конец)
В обоих наших примерах begin = 0.
Однако, хотя и null, и undefined представляют отсутствие значения, результат для end = null не имеет ничего общего с результатом для end = undefined.
Причина - Спецификация ECMAScript.
Что говорит,
- если «
endне определено», то «endдлина массива». - else « toInteger (_ 85_)», что переводится как « toNumber (_ 86_)».
По определению
toNumber(null)это0.
Наше заявление [1, 2, 3].slice(0, null) на самом деле [1, 2, 3].slice(0, 0).
Ты угадал. Это
[].
🍻 Благодарю: ОГРОМНОЕ спасибо @joaoffalcao за этот WTF.
‹Ваш WTF›
Если вы найдете какой-нибудь WTF, который должен быть здесь, дайте мне знать 👐
Это все, что касается массивов.
Благодаря :
- Документация MDN
- Кайл Симпсон за его видео и книгу
- Уилл Феррел за гифки
- Ребята из Paddy Power Betfair, особенно João и Pedro, за отзыв 🦄
- Автор WTF João Falcão 👊
- Hacker Noon для публикации ❤️
Обязательно ознакомьтесь с другими моими статьями о JS WTF