Pourquoi est (( === ] + / – /) = 'a' et (1 + {}) = 'b' en javascript?

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:

Entrez la description de l'image ici

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 .