Réponse
Trop de publicités?@Mauricio a commenté (![]+[])[+[]]
est "f" (le premier caractère de "faux"), (![]+[])[+!+[]])
"est " un", etc...
Comment ça fonctionne?
Examinons le premier caractère, "f":
(![]+[])[+[]]; // 'f'
La première partie de l'expression entre parenthèses est composé d' ![]+[]
, le premier opérande de l'opérateur d'Addition est ![]
et il produira false
, car un tableau d'objet-comme de toute autre instance de l'Objet-est truthy, et de l'application de la Logique (!) PAS d'opérateur unaire, il produit de la valeur false
, par exemple.
![]; // false, it was truthy
!{}; // false, it was truthy
!0; // true, it was falsey
!NaN; // true, it was falsey
Après cela, nous avons le deuxième opérande de plus, un Tableau vide, []
, c'est fait juste pour convertir l' false
de la valeur de Chaîne, parce que la représentation sous forme de chaîne d'un tableau vide est juste une chaîne vide, est équivalent à:
false+[]; // "false"
false+''; // "false"
La dernière partie, la paire de crochets après les parenthèses, ils sont la propriété de l'accesseur, et qu'ils reçoivent une expression, qui est formé par l'Unaire Plus Opérateur appliqué à un tableau vide à nouveau.
Ce Unaire Plus Opérateur n'est conversion de type, Number
, par exemple:
typeof +"20"; // "number"
Une fois de plus, cette méthode est appliquée à un Tableau vide, et comme je l'ai dit avant, la représentation sous forme de Chaîne d'un Tableau est une chaîne vide, et quand vous convertir une chaîne vide en Nombre, il est converti à zéro:
+[]; // 0, because
+[].toString(); // 0, because
+""; // 0
Par conséquent, nous pouvons "décoder" l'expression de en quelques étapes:
(![]+[])[+[]];
(false+[])[+[]];
(false+'')[+[]];
(false+'')[0];
('false')[0]; // "f"
Notez que l'accès à des caractères en utilisant le support de la notation sur les valeurs de Chaîne ne faisait pas partie de l'ECMAScript 3ème. Edition Spécifications, (c'est pourquoi l' charAt
méthode existait).
Cependant ce type de "propriétés de l'index" qui représentent les caractères d'une chaîne de caractères ont été normalisés sur ECMAScript 5, et même avant la normalisation de la fonction était disponible dans un bon nombre de navigateurs (même dans IE8 (mode normes)).