alert((![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]);
Die Ausgabe dieses Codes lautet : fail
. Warum?
Übrigens (![]+[])[+!+[]] == 'false'[1]
, richtig? Aber warum ![]+[] == "false"
und warum +!+[] == 1
?
javascript
cdxf
quelle
quelle
(![]+[])[+[]]
ist "f" (das erste Zeichen von "false"),(![]+[])[+!+[]]
ist "a" usw.alert(![]+[])
dannalert(+!+[])
und Sie werden sehen.Antworten:
Wie @Mauricio kommentierte,
(![]+[])[+[]]
ist "f" (das erste Zeichen von "false"),(![]+[])[+!+[]])
ist "a", etc ...Wie funktioniert es?
Untersuchen wir das erste Zeichen 'f':
Der erste Teil des Ausdrucks - in Klammern - besteht aus
![]+[]
dem ersten Operanden des Addition-Operators![]
und wird erzeugtfalse
, da ein Array-Objekt - wie jede andere Objektinstanz - wahr ist und das logische (!) NICHT unär anwendet Operator, es erzeugtfalse
zum Beispiel den Wert .Danach haben wir den zweiten Operanden der Addition, ein leeres Array.
[]
Dies dient nur zum Konvertieren desfalse
Werts in einen String, da die String-Darstellung eines leeren Arrays nur ein leerer String ist.Der letzte Teil, das Paar eckiger Klammern nach den Klammern, ist der Eigenschaftszugriff und sie erhalten einen Ausdruck, der vom Unary Plus-Operator gebildet wird, der erneut auf ein leeres Array angewendet wird.
Der Unary Plus-Operator führt eine Typkonvertierung durch
Number
, zum Beispiel in:Ein weiteres Mal wird dies auf ein leeres Array angewendet. Wie bereits erwähnt, ist die Zeichenfolgendarstellung eines Arrays eine leere Zeichenfolge. Wenn Sie eine leere Zeichenfolge in Zahl konvertieren, wird sie in Null konvertiert:
Daher können wir den Ausdruck in einigen Schritten "dekodieren":
Beachten Sie, dass der Zugriff auf Zeichen mithilfe der Klammernotation für Zeichenfolgenwerte nicht Teil von ECMAScript 3 war. Editionsspezifikation, (deshalb die
charAt
Methode).Diese Art von "Indexeigenschaften", die die Zeichen einer Zeichenfolge darstellen, wurden jedoch in ECMAScript 5 standardisiert, und bereits vor der Standardisierung war die Funktion in einer Reihe von Browsern verfügbar (sogar in IE8 (Standardmodus)).
quelle
int
Datentyp in der Sprache. Tatsächlich haben alle Zahlen ein 64-Bit-Format mit doppelter Genauigkeit (IEEE 754-Werte), obwohl einige Operatoren intern mit ganzzahligen Werten arbeiten (wie die bitweisen Operatoren), ist das Ergebnis immer ein Doppel . Das'i'
kommt in diesem Beispiel vonundefined
, aber es könnteInfinity
zum Beispiel kommen von :(+!+[]/+[+[]]+[])[!+[]+!+[]+!+[]]
=>(1/0+'')[3]
=>(Infinity+'')[3]
=>'i'
"falseundefined"
(mit :) konstruierte Form zu bilden,[![]]+[][[]]
in der der Index von "i" 10+!+[]+[+[]]
ergibt"10"
. Dies wird verwendet, um das "i" zu extrahieren (String-Indizes können in Javascript verwendet werden, wenn sie anscheinend zu ganzen Zahlen gezwungen werden können). Das letzte Konstrukt, das es erzeugt, ist:([![]]+[][[]])[+!+[]+[+[]]]