alert((![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]);
Выходной сигнал этого кода: fail
. Зачем?
Кстати, (![]+[])[+!+[]] == 'false'[1]
да ?. Но почему ![]+[] == "false"
и почему +!+[] == 1
?
javascript
cdxf
источник
источник
(![]+[])[+[]]
это «f» (первый символ от «false»),(![]+[])[+!+[]]
это «a» и т. д.alert(![]+[])
Тогда попробуйте,alert(+!+[])
и вы увидите.Ответы:
Как прокомментировал @Mauricio,
(![]+[])[+[]]
это «f» (первый символ «false»),(![]+[])[+!+[]])
это «a» и т. Д.Как это работает?
Давайте рассмотрим первый символ, "f":
Первая часть выражения, заключенная в круглые скобки, состоит
![]+[]
из первого операнда оператора сложения , и![]
он будет порождатьfalse
, потому что объект массива - как и любой другой экземпляр объекта - является правдивым , и применение логического (!) НЕ унарного оператор, онfalse
, например , выдает значение .После него у нас есть второй операнд добавления, пустой массив,
[]
это сделано только для преобразованияfalse
значения в String, потому что строковое представление пустого массива является просто пустой строкой, что эквивалентно:Последняя часть, пара квадратных скобок после скобок, они являются средством доступа к свойствам, и они получают выражение, которое формируется оператором Unary Plus, снова применяемым к пустому массиву.
Оператор Unary Plus выполняет преобразование типов
Number
, например, в:Еще раз, это применяется к пустому массиву, и, как я сказал ранее, строковое представление массива является пустой строкой, и когда вы конвертируете пустую строку в Number, она преобразуется в ноль:
Поэтому мы можем «декодировать» выражение в несколько шагов:
Обратите внимание, что доступ к символам с использованием обозначения скобок для значений String не был частью ECMAScript 3rd. Спецификация издания, (поэтому
charAt
метод и существовал).Однако такого рода «свойства индекса», представляющие символы строки, были стандартизированы в ECMAScript 5, и даже до стандартизации эта функция была доступна в большом количестве браузеров (даже в IE8 (стандартный режим)).
источник
int
типа данных, на самом деле все числа имеют 64-битный формат двойной точности (значения IEEE 754), хотя некоторые операторы внутренне работают с целочисленными значениями (например, побитовые операторы), результат всегда двойной . В'i'
этом примереundefined
, но он может быть получен,Infinity
например:(+!+[]/+[+[]]+[])[!+[]+!+[]+!+[]]
=>(1/0+'')[3]
=>(Infinity+'')[3]
=>'i'
"falseundefined"
(построенного с использованием:),[![]]+[][[]]
в котором индекс «i» равен 10.+!+[]+[+[]]
дает"10"
. Это используется для извлечения «i» (строковые индексы можно использовать в javascript, если их можно явно привести к целым числам). Последняя конструкция, которая его производит:([![]]+[][[]])[+!+[]+[+[]]]