Почему и как ([! []] + [] [[]]) [+! + [] + [+ []]] Оценивается как буква «i»? [Дубликат]

На этот вопрос уже есть ответ здесь:

Почему ++ [[]] [+ []] + [+ []] возвращает строку «10” ? 9 ответов(! [] + []) [+ []] ... Объясните, почему это работает 1 ответ

Во время чтенияэта статья размещена на dzone Я нашел фрагмент JavaScript изначальноопубликовано в Twitter Маркусом Лагергреном.

Следующий код, по-видимому, печатает строку"fail"

(![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]];

Это включает в себя неявное приведение типов, и яЯ пытаюсь понять, как именно эта строка интерпретируется.

мы выделяем каждого персонажа

(![]+[])[+[]] печать"f"(![]+[])[+!+[]] печать"a"([![]]+[][[]])[+!+[]+[+[]]] печать"i"(![]+[])[!+[]+!+[]] печатает я"l"

Также удалось разбить выражения, возвращающие каждую букву, кроме"i"

письмо"f"

![] пустой массив является объектом, который в соответствии сДокументация ECMAScript, пункт 9.2 оцениваетtrue при преобразовании вboolean так что этоfalse

false+[] согласноПункт 11.6.1 оба аргумента двоичного+ Оператор конвертируется в строку, поэтому мы получаем"false"+"", который оценивает"false"

+[] унарный оператор плюс вызываетToNumber преобразование с последующимToPrimitive преобразование, если аргумент являетсяObject, Результат такого преобразования определяется путем вызова[[DefaultValue]] внутренний метод объекта. В случае пустого массива по умолчанию0, (Документация ECMAScript, разделы:11.4.6,9,3,9.1)

"false"[0] мы'повторный доступ к символу по индексу0, следовательно"f"

письмо"a"

Та же история, единственное отличие здесь - это дополнительные преобразования в части в квадратных скобках (что дает число, указывающее на другой символ в строке"false"), вызванный использованием одинарного+ а также! операторы.

+[] оценивает0, как объяснено выше.

!0 оцениваетtrue как определено вРаздел 9.2 а такжеРаздел 11.4.9, Первый,0 преобразуется в логическое значениеfalse а затем оператор инвертирует значение.

+true опять же, унарный плюс вызываетToNumber преобразование, которое возвращает1 для двоичного (trueРаздел 11.4.6 а также9,3)

"false"[1] возвращает второй символ в строке, который"a"

буква "л"

!+[] оцениваетtrue как объяснено выше

true+true используя бинарный файл+ на примитивах запускаетToNumber преобразование. В случае истины, его результат1 а также1+1 равняется2

"false"[2] - понятно

письмо"i"

Что оставляет меня в тупике это письмо"i", Я вижу, что вторая часть (в квадратных скобках) оценивается как строка"10" и что первая часть (в скобках) возвращает"falseundefined" ноЯ могу'не делать головы или хвосты о том, как это происходит. Может ли кто-нибудь объяснить это шаг за шагом? Особенно магия, которая происходит с квадратными скобками? (массивы и доступ к массивам)

Если возможно, яМне бы хотелось, чтобы каждый шаг содержал ссылку на базовые правила ECMAScript.

Что я нахожу самым загадочным, так это часть:[][[]]

Ответы на вопрос(2)

Ваш ответ на вопрос