Nasıl bu sihirli Javascript çalışır?
Bu uyarı küçük bir javascript "Merhaba Dünya":
゚ω゚ノ=/`m´)ノ~┻━┻//*´∇`*/['_'];o=(゚ー゚)=_=3;c=(゚Θ゚)=(゚ー゚)-(゚ー゚);(゚Д゚)=(゚Θ゚)=(o^_^o)/(o^_^o);(゚Д゚)={゚Θ゚:'_',゚ω゚ノ:((゚ω゚ノ==3) '_')[゚Θ゚],゚ー゚ノ:(゚ω゚ノ '_')[o^_^o-(゚Θ゚)],゚Д゚ノ:((゚ー゚==3) '_')[゚ー゚]};(゚Д゚)[゚Θ゚]=((゚ω゚ノ==3) '_')[c^_^o];(゚Д゚)['c']=((゚Д゚) '_')[(゚ー゚) (゚ー゚)-(゚Θ゚)];(゚Д゚)['o']=((゚Д゚) '_')[゚Θ゚];(゚o゚)=(゚Д゚)['c'] (゚Д゚)['o'] (゚ω゚ノ '_')[゚Θ゚] ((゚ω゚ノ==3) '_')[゚ー゚] ((゚Д゚) '_')[(゚ー゚) (゚ー゚)] ((゚ー゚==3) '_')[゚Θ゚] ((゚ー゚==3) '_')[(゚ー゚)-(゚Θ゚)] (゚Д゚)['c'] ((゚Д゚) '_')[(゚ー゚) (゚ー゚)] (゚Д゚)['o'] ((゚ー゚==3) '_')[゚Θ゚];(゚Д゚)['_']=(o^_^o)[゚o゚][゚o゚];(゚ε゚)=((゚ー゚==3) '_')[゚Θ゚] (゚Д゚).゚Д゚ノ ((゚Д゚) '_')[(゚ー゚) (゚ー゚)] ((゚ー゚==3) '_')[o^_^o-゚Θ゚] ((゚ー゚==3) '_')[゚Θ゚] (゚ω゚ノ '_')[゚Θ゚];(゚ー゚) =(゚Θ゚);(゚Д゚)[゚ε゚]='\\';(゚Д゚).゚Θ゚ノ=(゚Д゚ ゚ー゚)[o^_^o-(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ '_')[c^_^o];(゚Д゚)[゚o゚]='\"';(゚Д゚)['_']((゚Д゚)['_'](゚ε゚ (゚Д゚)[゚o゚] (゚Д゚)[゚ε゚] (゚Θ゚) (゚ー゚) (゚Θ゚) (゚Д゚)[゚ε゚] (゚Θ゚) ((゚ー゚) (゚Θ゚)) (゚ー゚) (゚Д゚)[゚ε゚] (゚Θ゚) (゚ー゚) ((゚ー゚) (゚Θ゚)) (゚Д゚)[゚ε゚] (゚Θ゚) ((o^_^o) (o^_^o)) ((o^_^o)-(゚Θ゚)) (゚Д゚)[゚ε゚] (゚Θ゚) ((o^_^o) (o^_^o)) (゚ー゚) (゚Д゚)[゚ε゚] ((゚ー゚) (゚Θ゚)) (c^_^o) (゚Д゚)[゚ε゚] (゚ー゚) ((o^_^o)-(゚Θ゚)) (゚Д゚)[゚ε゚] (゚Θ゚) (゚Θ゚) (c^_^o) (゚Д゚)[゚ε゚] (゚Θ゚) (゚ー゚) ((゚ー゚) (゚Θ゚)) (゚Д゚)[゚ε゚] (゚Θ゚) ((゚ー゚) (゚Θ゚)) (゚ー゚) (゚Д゚)[゚ε゚] (゚Θ゚) ((゚ー゚) (゚Θ゚)) (゚ー゚) (゚Д゚)[゚ε゚] (゚Θ゚) ((゚ー゚) (゚Θ゚)) ((゚ー゚) (o^_^o)) (゚Д゚)[゚ε゚] (゚ー゚) (c^_^o) (゚Д゚)[゚ε゚] (゚Θ゚) ((o^_^o)-(゚Θ゚)) ((゚ー゚) (o^_^o)) (゚Д゚)[゚ε゚] (゚Θ゚) ((゚ー゚) (゚Θ゚)) ((゚ー゚) (o^_^o)) (゚Д゚)[゚ε゚] (゚Θ゚) ((o^_^o) (o^_^o)) ((o^_^o)-(゚Θ゚)) (゚Д゚)[゚ε゚] (゚Θ゚) ((゚ー゚) (゚Θ゚)) (゚ー゚) (゚Д゚)[゚ε゚] (゚Θ゚) (゚ー゚) (゚ー゚) (゚Д゚)[゚ε゚] (゚ー゚) ((o^_^o)-(゚Θ゚)) (゚Д゚)[゚ε゚] ((゚ー゚) (゚Θ゚)) (゚Θ゚) (゚Д゚)[゚o゚])(゚Θ゚))('_');
İyi görünümlü bir versiyonu:
゚ω゚ノ = /`m´)ノ~┻━┻//*´∇`*/['_'];
o = (゚ー゚) = _ = 3;
c = (゚Θ゚) = (゚ー゚) - (゚ー゚);
(゚Д゚) = (゚Θ゚) = (o^_^o)/(o^_^o);
(゚Д゚) = {
゚Θ゚: '_',
゚ω゚ノ: ((゚ω゚ノ==3) '_')[゚Θ゚],
゚ー゚ノ: (゚ω゚ノ '_')[o^_^o-(゚Θ゚)],
゚Д゚ノ: ((゚ー゚==3) '_')[゚ー゚]
};
(゚Д゚)[゚Θ゚] = ((゚ω゚ノ==3) '_')[c^_^o];
(゚Д゚)['c'] = ((゚Д゚) '_')[(゚ー゚) (゚ー゚)-(゚Θ゚)];
(゚Д゚)['o'] = ((゚Д゚) '_')[゚Θ゚];
(゚o゚)=(゚Д゚)['c'] (゚Д゚)['o'] (゚ω゚ノ '_')[゚Θ゚] ((゚ω゚ノ==3) '_')[゚ー゚] ((゚Д゚) '_')[(゚ー゚) (゚ー゚)] ((゚ー゚==3) '_')[゚Θ゚] ((゚ー゚==3) '_')[(゚ー゚) - (゚Θ゚)] (゚Д゚)['c'] ((゚Д゚) '_')[(゚ー゚) (゚ー゚)] (゚Д゚)['o'] ((゚ー゚==3) '_')[゚Θ゚];
(゚Д゚)['_'] = (o^_^o)[゚o゚][゚o゚];
(゚ε゚) = ((゚ー゚==3) '_')[゚Θ゚] (゚Д゚).゚Д゚ノ ((゚Д゚) '_')[(゚ー゚) (゚ー゚)] ((゚ー゚==3) '_')[o^_^o-゚Θ゚] ((゚ー゚==3) '_')[゚Θ゚] (゚ω゚ノ '_')[゚Θ゚];
(゚ー゚) = (゚Θ゚);
(゚Д゚)[゚ε゚] = '\\';
(゚Д゚).゚Θ゚ノ = (゚Д゚ ゚ー゚)[o^_^o-(゚Θ゚)];
(o゚ー゚o) = (゚ω゚ノ '_')[c^_^o];
(゚Д゚)[゚o゚] = '\"';
(゚Д゚)['_']((゚Д゚)['_'](゚ε゚ (゚Д゚)[゚o゚] (゚Д゚)[゚ε゚] (゚Θ゚) (゚ー゚) (゚Θ゚) (゚Д゚)[゚ε゚] (゚Θ゚) ((゚ー゚) (゚Θ゚)) (゚ー゚) (゚Д゚)[゚ε゚] (゚Θ゚) (゚ー゚) ((゚ー゚) (゚Θ゚)) (゚Д゚)[゚ε゚] (゚Θ゚) ((o^_^o) (o^_^o)) ((o^_^o)-(゚Θ゚)) (゚Д゚)[゚ε゚] (゚Θ゚) ((o^_^o) (o^_^o)) (゚ー゚) (゚Д゚)[゚ε゚] ((゚ー゚) (゚Θ゚)) (c^_^o) (゚Д゚)[゚ε゚] (゚ー゚) ((o^_^o)-(゚Θ゚)) (゚Д゚)[゚ε゚] (゚Θ゚) (゚Θ゚) (c^_^o) (゚Д゚)[゚ε゚] (゚Θ゚) (゚ー゚) ((゚ー゚) (゚Θ゚)) (゚Д゚)[゚ε゚] (゚Θ゚) ((゚ー゚) (゚Θ゚)) (゚ー゚) (゚Д゚)[゚ε゚] (゚Θ゚) ((゚ー゚) (゚Θ゚)) (゚ー゚) (゚Д゚)[゚ε゚] (゚Θ゚) ((゚ー゚) (゚Θ゚)) ((゚ー゚) (o^_^o)) (゚Д゚)[゚ε゚] (゚ー゚) (c^_^o) (゚Д゚)[゚ε゚] (゚Θ゚) ((o^_^o)-(゚Θ゚)) ((゚ー゚) (o^_^o)) (゚Д゚)[゚ε゚] (゚Θ゚) ((゚ー゚) (゚Θ゚)) ((゚ー゚) (o^_^o)) (゚Д゚)[゚ε゚] (゚Θ゚) ((o^_^o) (o^_^o)) ((o^_^o)-(゚Θ゚)) (゚Д゚)[゚ε゚] (゚Θ゚) ((゚ー゚) (゚Θ゚)) (゚ー゚) (゚Д゚)[゚ε゚] (゚Θ゚) (゚ー゚) (゚ー゚) (゚Д゚)[゚ε゚] (゚ー゚) ((o^_^o)-(゚Θ゚)) (゚Д゚)[゚ε゚] ((゚ー゚) (゚Θ゚)) (゚Θ゚) (゚Д゚)[゚o゚])(゚Θ゚))('_');
JSFiddle
Buradan alındı: http://codegolf.stackexchange.com/a/24041/17049
Herkes nasıl çalıştığı hakkında bir fikrin var mı? Hatta bu kodu alert
göremiyorum.
CEVAP
Kodu daha yakından bakmadan önce, JavaScript beri 1.5 identifiers sadece ASCII karakterler ama aynı zamanda Unicode karakter içeren izin verilir.
Bu durumda bu komik dizileri çok göreceli. Basit tanımlayıcılar tarafından bu mübadele edilmesini ve gereksiz yorum ve parantez çıkardıktan sonra, kodu aşağıdaki gibi görünüyor
a = /`m´)ノ~┻━┻/['_'];
o = b = _ = 3;
c = d = b-b;
e = d = o^_^o/o^_^o;
e = {
d: '_',
a: ((a==3) '_')[d],
h: (a '_')[o^_^o-d],
i: ((b==3) '_')[b]
};
e[d] = ((a==3) '_')[c^_^o];
e['c'] = (e '_')[b b-d];
e['o'] = (e '_')[d];
f = e['c'] e['o'] (a '_')[d] ((a==3) '_')[b] (e '_')[b b] ((b==3) '_')[d] ((b==3) '_')[b-d] e['c'] (e '_')[b b] e['o'] ((b==3) '_')[d];
e['_'] = (o^_^o)[f][f];
g = ((b==3) '_')[d] e.i (e '_')[b b] ((b==3) '_')[o^_^o-d] ((b==3) '_')[d] (a '_')[d];
b = d;
e[g] = '\\';
e.j = (e b)[o^_^o-d];
obo = (a '_')[c^_^o];
e[f] = '\"';
e['_'](e['_'](g e[f] e[g] d b d e[g] d (b d) b e[g] d b (b d) e[g] d ((o^_^o) (o^_^o)) ((o^_^o)-d) e[g] d ((o^_^o) (o^_^o)) b e[g] (b d) (c^_^o) e[g] b ((o^_^o)-d) e[g] d d (c^_^o) e[g] d b (b d) e[g] d (b d) b e[g] d (b d) b e[g] d (b d) (b (o^_^o)) e[g] b (c^_^o) e[g] d ((o^_^o)-d) (b (o^_^o)) e[g] d (b d) (b (o^_^o)) e[g] d ((o^_^o) (o^_^o)) ((o^_^o)-d) e[g] d (b d) b e[g] d b b e[g] b ((o^_^o)-d) e[g] (b d) d e[f])(d))('_');
Şimdi bir anda her deyim değerlendirebilir ediyoruz:
a = /`m´)ノ~┻━┻/['_']
22* *olarak değerlendiriro = b = _ = 3
o
,b
_
tamsayı3
atarc = d = b-b
c
d
tamsayı0
atare = d = o^_^o/o^_^o
e
d
tamsayı1
(o^_^o
3 3 veren 3, 3 XOR XOR sonucunu verire = { d: '_', a: ((a==3) '_')[d], h: (a '_')[o^_^o-d], i: ((b==3) '_')[b] }
e
nesne{ d: '_', a: 'a', h: 'd', i: 'e' }
atare[d] = ((a==3) '_')[c^_^o]
e[1]
dize'f'
atare['c'] = (e '_')[b b-d]
e['c']
dize'c'
atare['o'] = (e '_')[d]
e['o']
dize'o'
atar
Bu sadece kur ve aşağıdaki değişkenleri ayarlanır:
a = undefined
b = 3
c = 0
d = 1
e = {
1: "f",
a: "a",
c: "c",
d: "_",
h: "d",
i: "e",
o: "o"
}
Sonraki deyimi bir şey inşa ilk
f = e['c'] // => "c"
e['o'] // => "o"
(a '_')[d] // => "undefined_"[1] = "n"
((a==3) '_')[b] // => "false_"[3] = "s"
(e '_')[b b] // => "object_"[6] = "t"
((b==3) '_')[d] // => "true_"[1] = "r"
((b==3) '_')[b-d] // => "true_"[2] = "s"
e['c'] // => "c"
(e '_')[b b] // => "object_"[6] = "t"
e['o'] // => "o"
((b==3) '_')[d]; // => "true"[1] = "r"
f = "constructor"
. Bir sonraki açıklamada "constructor"
bu işlevi almak için kullanılır:
e['_'] = (o^_^o)[f][f]
Bu function Function
, yani: veren (3).constructor.constructor
eşdeğer
e['_'] = Function
Function
bu fonksiyonu parametre) fonksiyonu vücut kodu geçerek fonksiyonları dinamik olarak inşa tek özel
f = Function("alert(1)")
// equivalent to
f = function() { alert(1) }
Önümüzdeki birkaç ifadeleri atlamak ve sonuç değişkenleri ve değerleri yazacağım:
a = undefined
b = 4
c = 0
d = 1
e = {
1: "f",
_: Function,
a: "a",
c: "c",
constructor: "\"",
d: "_",
h: "d",
i: "e",
j: "b",
o: "o",
return: "\\"
}
f = "constructor"
obo = "u"
Son açıklama son çalışır:
e['_'](e['_'](g e[f] e[g] d b d e[g] d (b d) b e[g] d b (b d) e[g] d ((o^_^o) (o^_^o)) ((o^_^o)-d) e[g] d ((o^_^o) (o^_^o)) b e[g] (b d) (c^_^o) e[g] b ((o^_^o)-d) e[g] d d (c^_^o) e[g] d b (b d) e[g] d (b d) b e[g] d (b d) b e[g] d (b d) (b (o^_^o)) e[g] b (c^_^o) e[g] d ((o^_^o)-d) (b (o^_^o)) e[g] d (b d) (b (o^_^o)) e[g] d ((o^_^o) (o^_^o)) ((o^_^o)-d) e[g] d (b d) b e[g] d b b e[g] b ((o^_^o)-d) e[g] (b d) d e[f])(d))('_');
Bu eşdeğerdir:
Function(Function( … )(1))('_')
Uzun ifade, aşağıdaki dize oluşturur:
return"\141\154\145\162\164\50\42\110\145\154\154\157\40\127\157\162\154\144\42\51"
Atlamalı dize değerlendirir:
alert("Hello World")
return
bu kod gibi isimsiz bir işlev yaratır Function
geçti
function anonymous() {
return"\141\154\145\162\164\50\42\110\145\154\154\157\40\127\157\162\154\144\42\51";
}
Biliyoruz, eşdeğerdir:
function anonymous() {
return"alert(\"Hello World\")";
}
Bu işlev, daha sonra oluşan bir dize döndürür parametre olarak 1
ile yürütülür:
alert("Hello World")
Bu daha sonra Function
yeni bir anonim işlev oluşturur: bir daha geçti
function anonymous() {
alert("Hello World");
}
Son olarak, bu fonksiyon da parametre olarak '_'
ile çağrılır.
JavaScript kilitler nasıl çalışır?...
Nasıl JavaScript yerelleştirme çalışır...
Nasıl bu karıştırılmış JavaScript çalı...
Nasıl değişken atama JavaScript çalışı...
Nasıl bir JavaScript nesnesinin bir öz...