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#L678Document.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
?
Réponses
Trop de publicités?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
~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
.
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.)