212 votes

Des doubles points d'exclamation ?

Duplicata possible :
Qu'est-ce que le ! !! (pas pas) en JavaScript ?
Que signifie l'opérateur ! ! (double point d'exclamation) en JavaScript ?

Je déboguais un code et je suis tombé sur ça :

var foo.bar = 0; // this is actually passed from another function, adding it for context

function(foo)
    var someVar = !!foo.bar;
    if(foo.bar){
      // ..stuff happens
    }
    else{
      // .. something else happens
    }
}

Ok, ma question est : quel est l'intérêt de ! !? Tout ce que cela fait est de rendre le 0 === faux. A. Y a-t-il un avantage à utiliser cette méthode par rapport à boolean(foo.bar) ?

B. foo.bar peut être évalué dans un if tel quel car 0 === false déjà, alors pourquoi passer par la conversion ? (someVar n'est pas réutilisé ailleurs)

Je suis juste un peu curieux...

Merci d'avance !

2 votes

Je sais ce qu'il fait, je veux juste savoir quel est l'avantage qui n'est pas expliqué dans votre question.

0 votes

0==false pas 0===false le triple égal empêche la tentative implicite de lancer.

332voto

Gazler Points 23588

Cela convertit une valeur en un booléen et assure un type booléen .

"foo"      =    "foo"
!"foo"     =    false
!!"foo"    =    true

Si foo.bar est transmise, alors il se peut que ce ne soit pas 0, mais une autre valeur fantaisiste. Voir la table de vérité suivante :

Table de vérité pour javascript

''        ==   '0'           // false
0         ==   ''            // true
0         ==   '0'           // true
false     ==   'false'       // false
false     ==   '0'           // true
false     ==   undefined     // false
false     ==   null          // false
null      ==   undefined     // true
" \t\r\n" ==   0             // true

Source : Doug Crockford

Javascript est également très bizarre lorsqu'il s'agit de valeurs NaN. Et c'est le seul cas auquel je peux penser de but en blanc où ! ! se comporterait différemment de ===.

NaN   ===  NaN     //false
!!NaN === !!NaN    //true

// !!NaN is false

15 votes

Cela ne répond pas vraiment à la question. La question demande : "foo.bar peut être évalué dans un if tel quel car 0 === false déjà, alors pourquoi passer par la conversion ?" Votre réponse explique que il garantit un type booléen, mais le PO le savait déjà ; la question est de savoir quelle est la point d'assurer un type booléen ?

0 votes

@ruakh L'instruction if est implicite et n'utilisera pas le ===.

1 votes

Désolé, pourriez-vous développer un peu votre dernier commentaire ? Parce que je ne vois vraiment pas où tu veux en venir. :-/

16voto

ruakh Points 68789

Je pense que la réponse est qu'il n'y a pas vraiment d'intérêt. Nous pouvons spéculer sur la façon dont cela s'est produit :

  • peut-être qu'une version antérieure de la fonction utilisait someVar dans de multiples endroits, ou d'une manière qui a réellement bénéficié d'avoir true ou false donc c'était plus logique.
  • peut-être que la personne qui a écrit la fonction est tellement habituée à utiliser !! à convertir en true / false qu'il n'a même pas remarqué que ce n'était pas nécessaire ici.
  • peut-être que la personne qui a écrit la fonction estime que chaque calcul (dans ce cas, la conversion booléenne) devrait recevoir un nom significatif en assignant une variable à son résultat.
  • peut-être, étant donné que la conversion booléenne en JavaScript est étonnamment sujette à des erreurs (en ce sens que, par exemple, la conversion booléenne en JavaScript n'est pas toujours possible). new Boolean(false) est une valeur vraie), la personne qui a écrit la fonction estime que cela devrait toujours être fait explicitement plutôt qu'implicitement - même si l'effet est le même - juste pour attirer l'attention sur ce point d'erreur potentiel.
    • ceci, bien sûr, présuppose que la personne qui a écrit la fonction pense à !! comme une conversion booléenne "explicite". Techniquement, ce n'est pas le cas - elle utilise la même conversion booléenne implicite que celle utilisée par if mais si vous êtes habitué à cet idiome, cela revient à une conversion explicite.

mais à mon avis subjectif, aucune de ces raisons n'est très bonne !

1 votes

Ceci est particulièrement pertinent, et me fait préférer cette réponse : "(en ce sens que, par exemple, le nouveau booléen (false) est une valeur vraie),".

0 votes

Je pense que cette réponse est meilleure que la réponse acceptée car elle explique réellement POURQUOI le double point d'exclamation a pu être utilisé comme le demande le PO, plutôt que de simplement expliquer ce qu'il fait. Je pense qu'il serait utile de préciser que ! ! vous donne une valeur booléenne alors que new Boolean() vous donne un objet booléen.

0 votes

(new Boolean(false)) == false en chrome 73...

5voto

Matt Brock Points 2160

Comme indiqué ci-dessus, il force un objet de type booléen. Vous pouvez le constater par vous-même :

(function typecheck() {
  var a = "a";
  var b = !a;
  var c = !!a;

  alert("var a = " + typeof(a) + "\n" +
        "var b = " + typeof(b) + "\n" +
        "var c = " + typeof(c));
})();

Si vous effectuez simplement des comparaisons, la conversion vous évite simplement une coercition de type par la suite.

Pour votre information, les valeurs suivantes sont forcées à FALSE en JavaScript :

  • faux
  • 0
  • ""
  • null
  • indéfini

0 votes

Par "contraint à FAUX", voulez-vous dire que si je fais quelque chose comme var b = (nullthing) ? 'sad' : 'happy' Je peux obtenir de manière fiable b = 'happy' si nullthing est 0, null, undefined blank ou false ? J'aurais pu jurer que j'ai eu des problèmes où il se plaignait d'être indéfini ou nul dans ce genre de situations.

0 votes

Les règles de comparaison sont un peu étranges. Voici une bonne explication approfondie . Dans l'exemple que vous donnez, vous avez raison de dire que vous obtiendrez une erreur de référence.

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