Jak skomentował @Mauricio, (![]+[])[+[]]to „f” (pierwszy znak wyrażenia „false”), (![]+[])[+!+[]])to „a” itd.
Jak to działa?
Przeanalizujmy pierwszy znak, „f”:
(![]+[])[+[]]; // 'f'
Pierwsza część wyrażenia - w nawiasach - jest utworzona przez ![]+[], pierwszy operand operatora dodawania jest ![]i będzie produkowany false, ponieważ obiekt tablicy - jak każda inna instancja Object - jest prawdziwy i stosuje jednoargumentowy Logiczny (!) NIE operator, generuje falsena przykład wartość .
![]; // false, it was truthy
!{}; // false, it was truthy
!0; // true, it was falsey
!NaN; // true, it was falsey
Po nim mamy drugi operand dodawania, pusty Array, który []jest tworzony tylko po to, aby przekonwertować falsewartość na String, ponieważ reprezentacja ciągu pustej tablicy jest po prostu pustym ciągiem, jest równoważna:
false+[]; // "false"
false+''; // "false"
Ostatnia część, para nawiasów kwadratowych po nawiasach, są akcesoriami właściwości i otrzymują wyrażenie, które jest tworzone przez jednoargumentowy operator plus zastosowany ponownie do pustej tablicy.
To, co robi Unary Plus Operator, to konwersja typów Number, na przykład:
typeof +"20"; // "number"
Jeszcze raz jest to stosowane do pustej tablicy i, jak powiedziałem wcześniej, reprezentacja ciągu w tablicy jest pustym ciągiem, a kiedy konwertujesz pusty ciąg na Number, jest konwertowany na zero:
+[]; // 0, because
+[].toString(); // 0, because
+""; // 0
Dlatego możemy "dekodować" wyrażenie w kilku krokach:
(![]+[])[+[]];
(false+[])[+[]];
(false+'')[+[]];
(false+'')[0];
('false')[0]; // "f"
Należy zauważyć, że uzyskiwanie dostępu do znaków przy użyciu notacji nawiasów w wartościach typu String nie było częścią trzeciego skryptu ECMAScript. Specyfikacja wydania (dlatego charAtistniała metoda).
Jednak tego rodzaju „właściwości indeksu”, które reprezentują znaki łańcucha, zostały ustandaryzowane w ECMAScript 5, a nawet przed standaryzacją funkcja była dostępna w wielu przeglądarkach (nawet w IE8 (tryb standardowy)).