2010-02-01 8 views
29

Je comprends what the double not operator does in JavaScript. Je suis curieux à propos de son utilisation et si oui ou non une affirmation récente que j'ai faite est correcte.Quand utiliser l'opérateur double not (!!) en JavaScript

dit que je ne if (!!someVar) est significatif ni est (!!someVar && ... parce que le if et la && provoquera someVar à évaluer comme un booléen donc le !! est superflu. En fait, la seule fois où je pourrais penser qu'il serait légitime d'utiliser l'opérateur double not est si vous vouliez effectuer une comparaison stricte avec une autre valeur booléenne (donc peut-être en retour une valeur qui attend vrai ou faux explicitement).

Est-ce correct? J'ai commencé à douter moi-même quand j'ai remarqué jQuery 1.3.2 utilisé à la fois if (!!someVar) et return !!someVar && ...

Le double n'a pas d'effet réel dans ces situations?

Mon opinion personnelle est que cela mène à la confusion. Si je vois une instruction if, je sais qu'elle l'évalue comme un booléen.

+2

Notez que (comme Justin le fait remarquer dans sa réponse à la question que vous avez référencée http://stackoverflow.com/questions/1406604/what-does-the-operator-double-exclamation-point-mean-in-javascript/ 1407785 # 1407785), il n'y a pas d'opérateur double-not. '!!' applique simplement l'opérateur non deux fois. – outis

+1

Cet 'opérateur' est la définition même de idiomatique ... À moins que vous ne sachiez de quoi il s'agit, vous risquez d'être confus ou simplement d'interpréter cela comme un «non». Je vais commencer à l'utiliser juste pour confondre mes collègues: D Si quelqu'un est intéressé, je l'ai vu dans le «sauvage» dans jQuery.grep – Sprague

+0

connexes: [Quelle est la différence entre si (!! condition) et si (condition)] (http://stackoverflow.com/q/19818574/1048572) – Bergi

Répondre

36

Dans le cadre de if statements je suis avec vous, il est complètement sûr car en interne, l'opération ToBoolean sera exécutée sur l'expression de la condition (voir l'étape 3 sur la spécification).

Mais si vous voulez, disons, retourner une valeur booléenne d'une fonction, vous devez vous assurer que le résultat sera effectivement booléen, par exemple:

function isFoo() { 
    return 0 && true; 
} 

console.log(isFoo()); // will show zero 
typeof isFoo() == "number"; 

En conclusion, le Boolean Logical Operatorspeut revenir un opérande, et non un résultat Boolean nécessairement:

eT logique opérateur (&&), renvoie la valeur de la deuxième opérande si le premier est t ruly:

true && "foo"; // "foo" 

Et il retournera la valeur du premier opérande si elle est par lui-même falsy:

NaN && "anything"; // NaN 
0 && "anything"; // 0 

D'autre part, l'opérateur logique OR (||) renverra la valeur du second opérande, si le premier est falsy:

false || "bar"; // "bar" 

Et il retournera la valeur du premier opérande si elle est par lui-même non-falsy:

"foo" || "anything"; // "foo" 

Peut-être il convient de mentionner que les falsy valeurs sont: null, undefined, NaN , 0, chaîne de longueur nulle, et bien sûr false.

Tout le reste (ce n'est pas falsy, un objet ou d'une valeur BooleanBoolean), évaluée à boolean context, retournera true.

+0

Une autre façon de dire ceci: l'opérateur logique AND retourne le premier opérande "falsifié" rencontré, tandis que l'opérateur OR logique renvoie le premier opérande "vérité". Aussi, pour être complet, -0 est également considéré comme "falsifié". – TMcManemy

+0

Si vous êtes dans une situation où vous avez besoin de '!! expr 'quelque chose, pensez à écrire' Boolean (expr) 'à la place par souci de lisibilité, car il est fonctionnellement équivalent. – conny

0

Oui, !! var est utilisé lorsque vous voulez 0 || 1 valeur de retour. L'une est la simple comparaison des valeurs de bool, si vous voulez que "a == b" soit l'équivalent de "a x ou b" sauf que a = 5 et b = 7 seraient tous les deux vrais mais pas égaux.

Une autre est quand vous voulez forcer un ensemble de conditions en bits d'une variable:

var BIT_NONEMPTY=1; 
var BIT_HASERRORS=2; 
var BIT_HASCHILDREN=4; 
var BIT_HASCONTENT=8; 

result_bitfields = 
    (!!countLines())*BIT_NOTEMPTY + 
    (!!errorCode())*BIT_HASERRORS + 
    (!!firstChild())*BIT_HASCHILDREN + 
    (!!getContent())*BIT_HASCONTENT; 

Pas très utile en Javascript qui vit assez loin des valeurs de bits, mais peut être utile à certains moments.

+3

Non: !! convertit en faux ou vrai, pas 0 ou 1. (Dans votre exemple bitfield, true est alors forcé à 1 et false à 0 par l'opérateur *). – Doin