@Mauricio'nun yorumladığı gibi (![]+[])[+[]]"f" ("yanlış" ın ilk karakteri), (![]+[])[+!+[]])"a", vb ...
O nasıl çalışır?
İlk karakter olan 'f'yi inceleyelim:
(![]+[])[+[]]; // 'f'
İfadenin ilk kısmı - parantezler arasında - ![]+[], Toplama operatörünün ilk işleneni tarafından oluşturulur ![]ve üretecektir false, çünkü bir dizi nesnesi - diğer herhangi bir Nesne örneği gibi - doğrudur ve Mantıksal (!) NOT tekli operatör, falseörneğin değeri üretir .
![]; // false, it was truthy
!{}; // false, it was truthy
!0; // true, it was falsey
!NaN; // true, it was falsey
Ondan sonra, toplamanın ikinci işlenenine sahibiz, boş bir Dizi, []bu sadece falsedeğeri String'e dönüştürmek için yapılır , çünkü boş bir dizinin dize temsili sadece boş bir dizedir, şuna eşdeğerdir:
false+[]; // "false"
false+''; // "false"
Son kısım, parantezlerden sonra köşeli parantez çifti, bunlar özellik erişimcisidir ve Unary Plus Operatörünün boş bir diziye tekrar uyguladığı bir ifade alırlar.
Unary Plus Operatörünün yaptığı şey Number, örneğin aşağıdakilere tür dönüştürmedir :
typeof +"20"; // "number"
Bir kez daha, bu boş bir Diziye uygulanır ve daha önce de söylediğim gibi, bir Array'in Dize temsili boş bir dizedir ve boş bir dizeyi Number'a dönüştürdüğünüzde, sıfıra dönüştürülür:
+[]; // 0, because
+[].toString(); // 0, because
+""; // 0
Bu nedenle, ifadeyi bazı adımlarda "çözebiliriz":
(![]+[])[+[]];
(false+[])[+[]];
(false+'')[+[]];
(false+'')[0];
('false')[0]; // "f"
Dize değerlerinde köşeli parantez gösterimini kullanarak karakterlere erişmenin ECMAScript 3'ün bir parçası olmadığını unutmayın. Sürüm Spesifikasyonu, ( charAtyöntem bu yüzden mevcuttu).
Bununla birlikte, bir dizenin karakterlerini temsil eden bu tür "dizin özellikleri", ECMAScript 5'te standartlaştırılmıştır ve standardizasyondan önce bile özellik, çok sayıda tarayıcıda mevcuttur (hatta IE8'de (standartlar modu)).