Récemment, j'ai rencontré un site intéressant qui illustre un Obfuscator Javascript: http://bl.ocks.org/jasonsperske/5400283
Par exemple, (([]===[])+/-/)[1]
donne a
et (1+{})[(1<<1)+1]
donne b
.
J'ai essayé de comprendre la séquence d'évaluation de ces résultats obscènes mais a été en vain.
Prenant (1+{})[(1<<1)+1]
titre d'exemple, je comprends que <<
est l'opérateur de changement de bits et renvoie 2, donc l'expression devient (1+{})[3]
. Mais alors, je ne comprends pas ce que cela signifie par 1+{}
et [3]
.
Google n'est pas vraiment utile à ce problème, car les moteurs de recherche n'aiment pas les brackets ou les barres de taille, donc, s'il y a des questions en double, je suis désolé à ce sujet.
Ce sont simplement des astuces d'obfuscation.
par exemple :
[]===[]
===> false
et
([]===[])+/-/
===> "false/-/"
(Vous pouvez le tester seul dans la console)
Alors, quel est (([]===[])+/-/)[1]
? (Deuxième char)
C'est vrai: 'a'
Vous voudrez peut -être regarder ceci aussi:
Vous pouvez aller étape par étape:
(([]===[]))
Est simplement false
. Converti en une chaîne "false/-/"
et indexé par [1]
vous donne l' a
de la chaîne "false".
Il en va de même pour (1+{})
qui aboutit à la chaîne "1[object Object]"
. Et 1 << 1 + 1 est une autre façon d'écrire 3
, ce qui se traduit par "1[object Object]"[3]
, qui est simplement b
.
1+{}
est une chaîne "1[object Object]"
, (1+{})[3]
est d'obtenir le char de l'index 3 qui est b
.
Le premier exemple:
[]===[]
Comparant deux objets différents avec ===
, donc le résultat est false
, dont le résultat de toString est "false"
.
/-/
est un objet regex, dont le résultat toString est "/-/"
Lorsque vous faites false + /-/
, qui concatera le résultat de .toString()
, le résultat sera "false/-/"
, et le second char est a
.