Давайте покатаемся на каком-нибудь 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