93 votes

Comment !!~ (not not tilde/bang bang tilde) modifie-t-il le résultat d'un appel à la méthode Array 'contains/included' ?

Si vous lisez les commentaires sur le site jQuery inArray page ici Il s'agit d'une déclaration intéressante :

!!~jQuery.inArray(elm, arr) 

Je pense qu'un double point d'exclamation convertira le résultat en type boolean avec la valeur de true . Ce que je ne comprends pas, c'est l'utilité du tilde ( ~ ) dans tout cela ?

var arr = ["one", "two", "three"];
if (jQuery.inArray("one", arr) > -1) { alert("Found"); }

Refonte de la if déclaration :

if (!!~jQuery.inArray("one", arr)) { alert("Found"); }

Répartition :

jQuery.inArray("one", arr)     // 0
~jQuery.inArray("one", arr)    // -1 (why?)
!~jQuery.inArray("one", arr)   // false
!!~jQuery.inArray("one", arr)  // true

J'ai également remarqué que si je mets le tilde devant, le résultat est le suivant -2 .

~!!~jQuery.inArray("one", arr) // -2

Je ne comprends pas l'utilité du tilde ici. Quelqu'un peut-il m'expliquer ou m'indiquer une ressource ?

117voto

Yahel Points 21516

Il y a une raison spécifique pour laquelle vous verrez parfois ~ appliquée devant $.inArray .

En principe,

~$.inArray("foo", bar)

est une façon plus courte de faire

$.inArray("foo", bar) !== -1

$.inArray renvoie l'index de l'élément dans le tableau si le premier argument est trouvé, et renvoie -1 s'il n'est pas trouvé. Cela signifie que si vous cherchez un booléen "cette valeur est-elle dans le tableau ?", vous ne pouvez pas faire une comparaison booléenne, puisque -1 est une valeur vraie, et lorsque $.inArray renvoie 0 (une valeur fausse), cela signifie qu'elle est effectivement trouvée dans le premier élément du tableau.

Application de la ~ l'opérateur bitwise provoque -1 devenir 0 et transforme 0 en `-1. Ainsi, le fait de ne pas trouver la valeur dans le tableau et d'appliquer le NOT bit à bit donne une valeur fausse (0), et toutes les autres valeurs renverront des nombres autres que 0, et représenteront un résultat véridique.

if (~$.inArray("foo", ["foo",2,3])) {
    // Will run
}

Et il fonctionnera comme prévu.

55voto

p.g.l.hall Points 1412

L'opérateur tilde ne fait pas du tout partie de jQuery - il s'agit d'un opérateur bitwise NOT dans JavaScript lui-même.

Voir Le grand mystère du Tilde(~) .

Vous obtenez des nombres étranges dans vos expériences parce que vous effectuez une opération logique bit à bit sur un nombre entier (qui, pour ce que j'en sais, peut être stocké en complément à deux ou quelque chose comme ça...).

_Complément à deux_ explique comment représenter un nombre en binaire. Je crois que j'avais raison.

18voto

Amadan Points 41944

jQuery.inArray() retours -1 pour "non trouvé", dont le complément ( ~ ) est 0 . Ainsi, ~jQuery.inArray() renvoie une valeur fictive ( 0 ) pour "non trouvé", et une valeur vraie (un nombre entier négatif) pour "trouvé". !! formalisera alors le falsy/truthy en un véritable système booléen. false / true . Ainsi, !!~jQuery.inArray() donnera true pour "trouvé" et false pour "non trouvé".

10voto

Pointy Points 172438

Les ~ est l'opérateur de complément bit à bit. Le résultat entier de inArray() est soit -1, lorsque l'élément n'est pas trouvé, soit un nombre entier non négatif. Le complément binaire de -1 (représenté en binaire par tous les bits 1) est zéro. Le complément binaire de tout entier non négatif est toujours différent de zéro.

Ainsi, !!~i será true lorsque le nombre entier "i" est un nombre entier non négatif, et false lorsque "i" vaut exactement -1.

Il convient de noter que ~ contraint toujours son opérande à devenir entier, c'est-à-dire qu'il force les valeurs à virgule flottante non entières à devenir entières, ainsi que les valeurs non numériques.

10voto

Joe Points 10301

Le tilde est un NOT bit à bit - il inverse chaque bit de la valeur. En règle générale, si vous utilisez ~ sur un nombre, son signe sera inversé, puis 1 sera soustrait.

Ainsi, lorsque vous faites ~0 vous obtenez -1 (0 inversé est -0, soustraire 1 est -1).

Il s'agit essentiellement d'un moyen élaboré et super-micro-optimisé d'obtenir une valeur qui est toujours booléenne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X