Wie @Mauricio kommentierte, (![]+[])[+[]]ist "f" (das erste Zeichen von "false"),(![]+[])[+!+[]]) ist "a", etc ...
Wie funktioniert es?
Untersuchen wir das erste Zeichen 'f':
(![]+[])[+[]]; // 'f'
Der erste Teil des Ausdrucks - in Klammern - besteht aus ![]+[]dem ersten Operanden des Addition-Operators ![]und wird erzeugt false, da ein Array-Objekt - wie jede andere Objektinstanz - wahr ist und das logische (!) NICHT unär anwendet Operator, es erzeugt falsezum Beispiel den Wert .
![]; // false, it was truthy
!{}; // false, it was truthy
!0; // true, it was falsey
!NaN; // true, it was falsey
Danach haben wir den zweiten Operanden der Addition, ein leeres Array. []Dies dient nur zum Konvertieren des falseWerts in einen String, da die String-Darstellung eines leeren Arrays nur ein leerer String ist.
false+[]; // "false"
false+''; // "false"
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:
typeof +"20"; // "number"
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:
+[]; // 0, because
+[].toString(); // 0, because
+""; // 0
Daher können wir den Ausdruck in einigen Schritten "dekodieren":
(![]+[])[+[]];
(false+[])[+[]];
(false+'')[+[]];
(false+'')[0];
('false')[0]; // "f"
Beachten Sie, dass der Zugriff auf Zeichen mithilfe der Klammernotation für Zeichenfolgenwerte nicht Teil von ECMAScript 3 war. Editionsspezifikation, (deshalb diecharAt 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)).