Почему и как ([! []] + [] [[]]) [+! + [] + [+ []]] Оценивается как буква «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.
Что я нахожу самым загадочным, так это часть:[][[]]