alert((![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]);
Output dari kode ini adalah: fail
. Mengapa?
Ngomong-ngomong (![]+[])[+!+[]] == 'false'[1]
, kan ?. Tapi kenapa ![]+[] == "false"
dan kenapa +!+[] == 1
?
javascript
cdxf
sumber
sumber
(![]+[])[+[]]
adalah "f" (karakter pertama dari "false"),(![]+[])[+!+[]]
adalah "a", dll.alert(![]+[])
kemudianalert(+!+[])
dan Anda akan melihat.Jawaban:
Seperti yang dikomentari oleh @Mauricio
(![]+[])[+[]]
adalah "f" (karakter pertama dari "false"),(![]+[])[+!+[]])
adalah "a", dll ...Bagaimana cara kerjanya?
Mari kita periksa karakter pertama, 'f':
Bagian pertama dari ekspresi-antara kurung-disusun oleh
![]+[]
, operan pertama operator Penambahan ini![]
dan itu akan menghasilkanfalse
, karena obyek-sebagai array yang setiap Obyek lain misalnya-adalah truthy , dan menerapkan Logical (!) TIDAK unary operator, itu menghasilkan nilaifalse
, misalnya.Setelah itu, kita memiliki operan kedua tambahan, Array kosong
[]
, ini dibuat hanya untuk mengubahfalse
nilai menjadi String, karena representasi string dari array kosong hanyalah string kosong, setara dengan:Bagian terakhir, pasangan tanda kurung siku setelah tanda kurung, mereka adalah pengakses properti, dan mereka menerima ekspresi, yang dibentuk oleh Operator Unary Plus yang diterapkan ke array kosong lagi.
Apa yang dilakukan oleh Unary Plus Operator adalah konversi tipe
Number
, sebagai contoh:Sekali lagi, ini diterapkan ke Array kosong, dan seperti yang saya katakan sebelumnya, representasi String dari Array adalah string kosong, dan ketika Anda mengonversi string kosong menjadi Angka, itu diubah menjadi nol:
Oleh karena itu, kita dapat "mendekode" ekspresi menjadi dalam beberapa langkah:
Perhatikan bahwa mengakses karakter dengan menggunakan notasi braket pada nilai String bukanlah bagian dari ECMAScript ke-3. Spesifikasi Edisi, (itulah mengapa file
charAt
metode ini ada).Namun, jenis "properti indeks" yang mewakili karakter string ini distandarisasi pada ECMAScript 5, dan bahkan sebelum standarisasi fitur tersebut tersedia di sejumlah browser yang baik (bahkan dalam IE8 (mode standar)).
sumber
int
tipe data pada bahasa tersebut, pada kenyataannya semua angka dalam format 64-bit presisi ganda (nilai IEEE 754), meskipun beberapa operator bekerja secara internal dengan nilai Integer (seperti operator bitwise) hasilnya selalu ganda . Contoh ini'i'
berasal dariundefined
, tetapi bisa berasal dariInfinity
misalnya:(+!+[]/+[+[]]+[])[!+[]+!+[]+!+[]]
=>(1/0+'')[3]
=>(Infinity+'')[3]
=>'i'
"falseundefined"
(dibangun menggunakan[![]]+[][[]]
:) di mana indeks "i" adalah 10.+!+[]+[+[]]
memberikan"10"
. Ini digunakan untuk mengekstrak "i" (Indeks string dapat digunakan dalam javascript jika mereka dapat dipaksa menjadi bilangan bulat). Konstruksi terakhir yang menghasilkannya adalah:([![]]+[][[]])[+!+[]+[+[]]]