2011-06-27 3 views
3

J'examinais le src de underscore.js et découvert ceci:Javascript Opérateur logique:?

_.isRegExp = function(obj) { 
    return !!(obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase === false)); 
}; 

Pourquoi "!!" utilisé? Faut-il le lire comme NOT-NOT ou y at-il une nuance JS ésotérique qui se passe ici?

+0

nuance JS ésotérique lol – dynamic

+1

Il est appelé un raccourci, pas une nuance JS ésotérique. De la même manière que l'opérateur '+' est utilisé pour convertir en un nombre (par exemple: '+" 0 "') et que '+" "' est utilisé pour convertir en une chaîne. – HoLyVieR

+1

duplicata possible de [Quelle est la !! opérateur en JavaScript?] (http://stackoverflow.com/questions/784929/what-is-the-operator-in-javascript) –

Répondre

12

C'est juste une manière obtuse de lancer le résultat à un booléen.

+1

gentil ne savait pas – dynamic

2

Oui, ce n'est PAS-NOT. Il est couramment utilisé idiome pour convertir une valeur en un booléen de vérité équivalente.

JavaScript comprend 0.0, '', null, undefined et false comme falsy, et toute autre valeur (y compris, évidemment, true) comme truthy. Cet idiome convertit tous les précédents en booléen false, et tous les derniers en booléen true.

Dans ce cas particulier,

a && b 

renverra b si les deux a et b sont truthy;

!!(a && b) 

renverra true si les deux a et b sont truthy.

+1

Vous avez oublié 'NaN' (comme étant falsey). – user113716

+0

Oh putain, alors j'ai fait ... :) – Amadan

0

Il est juste deux! opérateurs les uns à côté des autres. Mais une double négation est inutile à moins que vous n'utilisiez !! comme un opérateur à convertir en type booléen.

Il convertit tout vrai ou faux ...

1

Le & & retourne l'opérateur soit faux ou la dernière valeur dans l'expression:

("a" && "b") == "b" 

Le || opérateur renvoie la première valeur qui évalue à vrai

("a" || "b") == "a" 

Le! opérateur retourne un booléen

!"a" == false 

Donc, si vous voulez convertir une variable à un booléen, vous pouvez utiliser !!

var myVar = "a" 
!!myVar == true 

myVar = undefined 
!!myVar == false 

etc.