1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| function ster(num) {
var a = 1; b = 2;
// première embuche : attention au ";"
// la variable "b" n'étant pas déclarée avec "var", elle est globale et sera donc accessible depuis la fonction "ber"
a += (0,5);
// autre fourberie : l'opérateur "," renvoie la valeur de l'expression de droite (si si !) (à ne pas confondre avec un "." qui ici aurait fait office de séparateur décimal dans l'écriture d'un "number" littéral
(b > a) ? a = b : b = a;
// ici, rien de méchant si on a suivi correctement le début : comme a = 6 ALORS b < a ALORS b est désormais égal à 6 également.
b += 1 || 2;
// l'opérateur "||" renvoie la valeur de la première expression si elle est évaluée comme "true" (ici, un entier non-nul) donc après cette ligne b = 7
a += ++b;
// mini-fourberie : en fonction de son placement, l'opérateur d'incrémentation (++) renvoie la valeur avant ou après l'opération... ^^ ici en l'occurrence, la valeur après incrémentation (8), faisant passer "a" à 14.
b = b - (a - b);
// donc b = 8 - (14 - 8) = 2
return (a === num.ber(b));
// au moment de l'appel à la fonction "ber", a = 14 et b = 2
}
Number.prototype.ber = function(a) {
// on a donc ici :
// a = 2
// this = "le nombre qu'il fallait deviner"
// b = 2 (car elle est globale et donc accessible ici)
this.b = a * 2;
// cette ligne ne sert "à rien" à part brouiller les pistes, car la propriété "b" de l'objet courant ne sera jamais utilisée
b += a || b;
// c'est toujours la globale qu'on modifie, et non pas la propriété homonyme de l'objet courant, donc b = 4
return (this + b);
// la valeur à retourner pour résoudre le problème étant "14", on a 14 = this + 4 donc...
// "this" doit être égal à 10 ^^ (et ne me dites pas que ca ne sonne pas pareil !)
} |
Partager