L’opérateur NOT bitwise est en général utilisé comme un Math.floor()
, en plus rapide. Mais il a une propriété amusante sur les entiers, il les transforme en -(N+1)
, où N est l’entier en question.
La conséquence ?
~-2 => 1 ~-1 => 0 ~0 => -1 ~1 => -2 ~2 => -3
Or, en javascript on a un problème avec le fait que la seule option pour rechercher un élément dans un ensemble soit des fonctions comme indexOf
qui retournent l’index de ce qu’elles trouvent ou -1
, les chiennes.
Ce qui fait que:
if ("truc".indexOf('t')) { console.log('trouvé') } |
Ne va rien afficher, car 't'
est à la première place, renvoyant l’index 0
, qui est “faux” dans un contexte booléan. Mais :
if ("truc".indexOf('z')) { console.log('trouvé') } |
Va afficher “trouvé” car la fonction renvoit -1
quand elle ne trouve rien. C’est nul. On se retrouve donc à faire du :
if ("truc".indexOf('z') > -1) { console.log('trouvé') } |
Ce qui est moche comme ça en peut plus. Mais avec l’opérateur bitwise, 0
devient -1
(donc vrai, comme tous les autres chiffres) et -1
devient zéro.
if (~"truc".indexOf('t')) { console.log('trouvé') } |
Et là ça va marcher !
Vous venez officiellement de passer 10 minutes sur un article qui va vous faire gagner 1 seconde sur l’ensemble de votre vie. En fait même pas, car pour garder votre code lisible, je vous recommande de ne pas utiliser cette technique.
De rien.
Ce petit coin de nature est l’endroit idéal pour poser un lien vers un entretien rigolo avec Douglas Crockford: http://jaxenter.com/douglas-crockford-java-was-a-colossal-failure-javascript-is-succeeding-because-it-works-45928.html
“En fait même pas, car pour garder votre code lisible, je vous recommande de ne pas utiliser cette technique. ”
Haha :D
Merci !
Je jure de l’utiliser à déraison.
Yo, commentaire qui n’a rien à voir mais qui peux vous donner du grains à moudre : http://phpsadness.com/
Vous faites pas des tampons “Merci bibi” pour les articles ? =D
On préfère les coms, ça nous remonte le moral et c’est cumulatif.
Perso en java ca doit etre faisable en javascript aussi ca permet de faire des for stylés :
for (int i = 0;i < 5; i = -(~i))
{
System.out.println(i);
}
Voilà qui est bien amusant. Mais savez-vous au moins pourquoi l’opérateur ~ est équivalent à -(N+1) ?
Eh bien moi je sais. Ça vient de la façon dont le n’ordinateur représente les entiers signés en binaire.
Hop, c’est par ici.
Tiens, tout ça marche aussi en Python :-P
J’aime bien l’article et sa conclusion
Oui mais bon en Python on utilise “in” pour ça, et tous les opérateurs logiques retourne soit un booléen soit un des objets testés donc y a pas de piège.