2009-12-14 9 views
2

Possible en double:
What is the !! (not not) operator in JavaScript?JavaScript !! opérateurs

Je l'ai vu opérateur ! utilisé comme !!. Par exemple

 

var filter = !!(document.body.filters); 
 

Si je ne me trompe pas c'est l'équivalent var filters = typeof document.body.filters != 'undefined'?

Est-ce une bonne pratique d'utiliser !!?

+1

Voir aussi http://stackoverflow.com/questions/1406604/what-does-operator-mean-in-javascript – tttppp

+0

double: http://stackoverflow.com/ questions/784929/what-is-the-operator-in-javascript –

+2

duplicata du rapport en double! –

Répondre

4

C'est un moyen courant de convertir n'importe quel type de retour en booléen (généralement pour éviter les avertissements de compilation). Et ensuite: non, vérifier si le type est "indéfini" est obligatoire quand même et "!!" Je ne peux pas le couvrir.

+0

Que voulez-vous dire par "vérifier si type est" indéfini "est obligatoire de toute façon et" !! "ne peut pas le couvrir."? –

+0

"!!" vous permettra seulement de vérifier si l'opérande est à zéro de n'importe quel roi, mais seulement "typeof()" peut vous dire si l'opérande est défini. "!!" pour l'opérande indéfini jettera une erreur. – alemjerus

+0

OK, je vois ce que vous obtenez maintenant. Il n'est pas toujours vrai que '!' (Et par conséquent '!!') lancera une erreur pour un opérande non défini: par exemple, '!! window.bananas' ne lancera pas d'erreur alors que' !! bananas' le fera. Mais en général, pour tester si un objet ou une propriété est indéfini, 'typeof' (un opérateur, pas une fonction, donc pas de parenthèses) est le chemin à parcourir. –

5

À vous de choisir. Tout !! est "cast" son argument à un booléen.

1

! nie le résultat de tout ce qui est à droite. Alors !! nie la valeur niée, se terminant ainsi par ce qui était à l'origine à droite.

modifier: ce qui précède est vrai si vous avez des valeurs booléennes, les résultats peuvent varier pour d'autres types ...

Edit2 d'élaborer un peu plus: !! est un opérateur de "type cast" de toutes sortes. Si vous avez une valeur booléenne sur la droite, rien ne se passera. Si vous avez quelque chose d'autre qu'une valeur booléenne sur la droite, alors la première! convertira tout ce qui est à droite en la "version" booléenne de cette valeur, et la seconde! annulera cette valeur. Un peu comme dire: renvoie la vraie valeur d'une valeur non booléenne. Espérons que cela a du sens :)

+0

pas vrai. ceci n'est vrai que pour les booléens, qui ne sont pas le sujet de la question. –

+1

C'est vrai quel que soit le type d'origine. – jonchang

+0

Cela dépend si ce qui était à droite était une valeur booléenne. –

0

Et si c'est une chaîne avec la valeur "undefined"?

Je pense que !! (expression) est propre.

+0

alors l'expression typeof retournera "string" –

1

var filter = !!(document.body.filters);

est pas équivalent à

var filters = typeof document.body.filters != 'undefined'

!! vérifie simplement si l'opérande est "truthy", à savoir si elle est évaluée à vrai lorsqu'il est utilisé dans une expression booléenne. Il n'a aucune relation avec typeof. En général, avec les objets hôtes (tels que document.body.filters), il vaut mieux utiliser les contrôles typeof. L'article suivant est une bonne lecture sur ce sujet: http://peter.michaux.ca/articles/feature-detection-state-of-the-art-browser-scripting