45 votes

Que signifie "!! ~" en javascript?

Double Possible:
Ce n'tilde (~) qui précède l'objet jQuery?

J'ai trouvé une étrange !!~ dans le code lors de la lecture: https://github.com/LearnBoost/mongoose/blob/master/lib/document.js#L678

Document.prototype.isModified = function (path) {
  return !!~this.modifiedPaths.indexOf(path);
};

J'ai lu que Ce qui est la !! (ne pas) opérateur en JavaScript? et Comment: Le ~ opérateur?; pourquoi l'auteur utilise !!~ ici?

J'ai essayé:

!!~1  // -> true
!!~0  // -> true
!!~-1 // -> false
!!~-2 // -> true

Il semble qu'il ne sera false lorsque le nombre est -1. Est-il juste? Pourquoi ne pas vérifier le numéro n'est pas -1 ou >=0?

102voto

Salman A Points 60620

L' !!~expr retours false lorsque expr est -1; elle renvoie true sinon. Il fonctionne comme ceci:

   -1 = 1111 1111 1111 1111 1111 1111 1111 1111b
  ~-1 = 0000 0000 0000 0000 0000 0000 0000 0000b // ~ = bitwise not = invert all bits
   !0 = true
!true = false

Une valeur autre que -1 ont au moins un ensemble de bits à zéro; en l'inversant permettra de créer un truthy valeur, en appliquant ! opérateur à deux reprises pour une truthy valeur des rendements boolean true.

Le ci-dessus mentionné, la fonction renvoie la valeur true si la chaîne recherchée/tableau renferme les aiguilles:

!!~"abc".indexOf("d") // indexOf() returns -1, the expression evaluates to false
!!~"abc".indexOf("a") // indexOf() returns  0, the expression evaluates to true
!!~"abc".indexOf("b") // indexOf() returns +1, the expression evaluates to true

Personnellement, je pense que c'est un mauvais codage considérant combien de temps vous avez passé déchiffrer une ligne de code. Il pourrait facilement avoir été écrite comme suit:

return this.modifiedPaths.indexOf(path) != -1; // note: indexOf returns a number >= -1

32voto

zzzzBov Points 62084

~foo.indexOf(bar) est un raccourci courant pour représenter foo.contains(bar) car la fonction contains n'existe pas.

Généralement, la conversion au booléen n'est pas nécessaire en raison du concept de "fausseté" de JavaScript. Dans ce cas, il est utilisé pour forcer la sortie de la fonction à être true ou false .

8voto

LukeH Points 110965

Vous avez raison: ce code renverra false lorsque l'appel indexOf retournera -1; sinon true .

Comme vous le dites, il serait beaucoup plus judicieux d’utiliser quelque chose comme

 return this.modifiedPaths.indexOf(path) !== -1;
 

3voto

Alexander Pavlov Points 16338

J'imagine que c'est là parce qu'il y a quelques caractères plus courts (que les auteurs de bibliothèques sont toujours après). Il utilise également des opérations qui ne prennent que quelques cycles de la machine lorsqu'elles sont compilées dans le code natif (par opposition à la comparaison à un nombre).

Je suis d’accord avec une autre réponse: c’est exagéré, mais cela pourrait peut-être avoir un sens dans une boucle étroite (nécessite une estimation du gain de performance, cependant, sinon cela pourrait se révéler être une optimisation prématurée.)

2voto

panos2point0 Points 110

Je suppose que, comme il s’agit d’une opération au niveau des bits, c’est le moyen le plus rapide (le moins coûteux du point de vue du calcul) de vérifier si le chemin apparaît dans modifiedPaths.

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