cette question est difficile à résumer dans un titre de question
UPDATE J'ai créé un JSFiddle qui construit une chaîne obfusquée à partir de votre entrée en se basant sur les lettres extraites de cette question : Vous pouvez y accéder ici ou est-ce qu'un Gist être plus facile ?
Je suis récemment tombé sur un amusant morceau de JavaScript obscurci dans ce profil qui ressemble à ça :
javascript:[[]+1/!1][1^1][1>>1]+({}+[])[1<<1^11>>1]+([]+!!-
[])[1<<1]+[/~/+{}][+!1][-~1<<1]+([]+/-/[(!!1+[])[1>>1]+(!!1
+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]+([,][
~1]+[])[1-~1]+[[]+{}][!1.1%1][11111.1%11.1*111e11|!1]+(/1/+
1/[1<1][1%1])[1^11]+[[],[]+{}][1][+1]+(/<</[1]+[])[1/1.1&1]
Désolé de gâcher la surprise, mais quand on l'évalue, on obtient ceci :
"I love you" in Chrome
"I lone you" In Firefox
"I lo[e you" in IE10
La façon dont cela fonctionne est de générer une série de messages et d'en tirer des lettres comme suit (en utilisant le "I" comme exemple) :
[]+1/!1
returns
"Infinity"
then
[[]+1/!1]
creates this array:
["Infinity"]
then
[[]+1/!1][1^1]
Takes the first (1^1 == 0) element of that array
"Infinity"
finally
[[]+1/!1][1^1][1>>1]
Takes the first (1>>1 == 0) char of that string
"I"
D'autres chaînes de caractères sont générées :
({}+[]) -> "[object Object]" (where the space comes from)
([]+!!-[]) -> "false" (used for it's "l")
[/~/+{}][+!1] -> "/~/[object Object]" (this is used for an "o")
(/<</[1]+[]) -> "undefined"
J'ai essayé de trouver un remplacement pour le "n" et le "[" et j'ai trouvé ceci :
String.fromCharCode(('1'.charCodeAt(0)<<1)+(10<<1))
Ce qui, à mon avis, est dans l'esprit de l'utilisation des 1 et des 0, mais viole l'un des aspects les plus élégants du code original qui est l'apparence de n'avoir rien à faire avec les chaînes de caractères. Est-ce que quelqu'un d'autre a une idée de la façon de générer un "v" qui soit en accord avec le code obfusqué original ?
Voici quelques informations supplémentaires qui ont été trouvées après que de nombreux programmeurs JavaScript talentueux aient jeté un coup d'œil plus approfondi sur cette question.
Firefox renvoie "I lone you" à cause de cette ligne :
([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]+
[1^11<<1]
enlève un caractère spécifique de celui-ci :
([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])
Ce qui donne ceci :
"function test() {
[native code]
}"
On dirait qu'on pourrait avoir notre "V" ! !!
Chrome renvoie "I love you", car le même code renvoie ceci :
"function test() { [native code] }"
Avant que la question ne soit fermée pour cause de lien douteux avec "un vrai problème de programmation", j'ai pensé ajouter une solution résumée qui s'appuie sur les principes suivants @Supr's , @Cory's y @alpha123's , regardez :
alert([[]+1/!1][1^1][1>>1]+({}+[])[1<<1^11>>1]+(
[]+!!-[])[1<<1]+[/~/+{}][+!1][-~1<<1]+[([]+/-/[(
!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(
!!1+[])[1^1]])[1+(1^(11+1+1)<<1)],([]+/-/[(!!1+[
])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[
])[1^1]])[1^11<<1],([]+/-/[(!!1+[])[1>>1]+(!!1+[
])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^(11
+1+1)<<1]][((([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<
1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[(1<<1<<1<<1
)+1<<1]==({}+[])[1^1])*1)+((([]+/-/[(!!1+[])[1>>
1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1
]])[(1^11<<1)-1]==({}+[])[1^1])<<1)]+([,][~1]+[]
)[1-~1]+[[]+{}][!1.1%1][11111.1%11.1*111e11|!1]+
(/1/+1/[1<1][1%1])[1^11]+[[],[]+{}][1][+1]+(/<</
[1]+[])[1/1.1&1])
Étant donné la complexité du code et le message qu'il produit, c'est presque comme si le moteur JavaScript disait à quel point vous le faites se sentir spécial :)