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

[] == ![]

Это происходит из-за precedence и coercion.

Дополнительное примечание - Приоритет определяет порядок, в котором выполняются операторы. Чем выше приоритет, тем раньше будет выполнена операция. Например, * имеет более высокий приоритет, чем оператор +. Что касается принуждения, это способность JS преобразовать один из операндов (оператора) в «эквивалентное» значение другого операнда. Это происходит, когда типы операндов различаются. Например, для boolean == integer операнд boolean будет преобразован в integer.

Благодаря precedence JS выполняет сначала операцию ![], а затем ==.

Операция логическое НЕ ![] отрицает истинность [] и возвращает логическое значение false. По шагу за шагом:

  1. Вычислите выражение [];
  2. Преобразуйте результат в логическое значение, например ToBoolean([]). По определению результат true;
  3. Вернуть 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, который должен быть здесь, дайте мне знать 👐

Это все, что касается массивов.

Благодаря :

Обязательно ознакомьтесь с другими моими статьями о JS WTF