184 votes

booléen dans une instruction if

Aujourd'hui, on m'a fait une remarque sur le code en considérant la façon dont je vérifie si une variable est vraie ou fausse dans un devoir scolaire.

Le code que j'avais écrit était quelque chose comme ceci :

var booleanValue = true;

function someFunction(){
    if(booleanValue === true){
        return "something";
    }
}

Ils ont dit que c'était mieux/beaucoup mieux de l'écrire comme ça :

var booleanValue = true;

function someFunction(){
    if(booleanValue){
        return "something";
    }
}

La remarque que j'ai reçue au sujet de la partie "=== true" était qu'elle n'était pas nécessaire et pouvait créer une confusion.

Cependant, mon idée est qu'il est préférable de vérifier si la variable est un booléen ou non, d'autant plus que Javascript est un langage loosetypé.

Dans le deuxième exemple, une chaîne de caractères renverrait également "quelque chose" ;

Ma question est donc la suivante : est-il plus propre de perdre la partie "=== true" à l'avenir, ou est-ce une bonne pratique de vérifier également le type de la variable ?

Editar: Dans mon "vrai" code, le booléen représente si une image a été supprimée ou non, donc les seules valeurs que boolValue devrait avoir sont true ou false.

0 et 1 par exemple ne devraient pas être dans cette variable.

279voto

jfriend00 Points 152127

Tout d'abord, les faits :

if (booleanValue)

satisfera les if pour toute valeur véridique de booleanValue y compris true tout nombre non nul, toute valeur de chaîne non vide, toute référence d'objet ou de tableau, etc...

D'un autre côté :

if (booleanValue === true)

Cela ne fera que satisfaire la if condition si booleanValue est exactement égal à true . Aucune autre valeur véridique ne pourra le satisfaire.

D'un autre côté, si vous faites ça :

if (someVar == true)

Ensuite, ce que Javascript fera est de taper coerce true pour correspondre au type de someVar et ensuite comparer les deux variables. Il existe de nombreuses situations où ce n'est probablement pas ce que l'on souhaite. Pour cette raison, dans la plupart des cas, vous voulez éviter == parce qu'il y a un ensemble assez long de règles sur la façon dont Javascript va forcer deux choses à être du même type et à moins que vous compreniez toutes ces règles et que vous puissiez anticiper tout ce que l'interpréteur JS pourrait faire lorsqu'il reçoit deux types différents (ce que la plupart des développeurs JS ne peuvent pas faire), vous voulez probablement éviter == entièrement.

Pour illustrer à quel point cela peut être déroutant :

var x;

x = 0;
console.log(x == true);   // false, as expected
console.log(x == false);  // true as expected

x = 1;
console.log(x == true);   // true, as expected
console.log(x == false);  // false as expected

x = 2;
console.log(x == true);   // false, ??
console.log(x == false);  // false 

Pour la valeur 2 on pourrait penser que 2 est une valeur véridique, elle se compare donc favorablement à true mais ce n'est pas ainsi que fonctionne la coercition de type. Il convertit la valeur de droite pour qu'elle corresponde au type de la valeur de gauche, c'est à dire qu'il convertit true au nombre 1 donc il s'agit de comparer 2 == 1 ce qui n'est certainement pas ce que vous vouliez.

Donc, attention à l'acheteur. Il est probablement préférable d'éviter == dans presque tous les cas, à moins de connaître explicitement les types à comparer et de savoir comment fonctionnent tous les algorithmes de coercition de types possibles.


Donc, cela dépend vraiment des valeurs attendues pour booleanValue et comment vous voulez que le code fonctionne. Si vous savez à l'avance qu'il n'y aura jamais qu'un seul code de type true o false puis en la comparant explicitement avec

if (booleanValue === true)

est juste du code supplémentaire et inutile et

if (booleanValue)

est plus compact et sans doute plus propre/meilleur.

Si, d'un autre côté, vous ne savez pas ce que booleanValue et vous voulez tester s'il est vraiment réglé sur true sans qu'aucune autre conversion automatique de type ne soit autorisée, alors

if (booleanValue === true)

n'est pas seulement une bonne idée, mais une nécessité.


Par exemple, si vous regardez l'implémentation de la fonction .on() dans jQuery, il a une valeur de retour optionnelle. Si le callback renvoie false alors jQuery arrêtera automatiquement la propagation de l'événement. Dans ce cas précis, puisque jQuery veut arrêter la propagation UNIQUEMENT si false a été retourné, ils vérifient la valeur de retour explicitement pour === false parce qu'ils ne veulent pas undefined o 0 o "" ou tout autre élément qui sera automatiquement converti en faux pour satisfaire également la comparaison.

Par exemple, voici le code de rappel du traitement des événements de jQuery :

ret = ( specialHandle || handleObj.handler ).apply( matched.elem, args );

if ( ret !== undefined ) {
     event.result = ret;
     if ( ret === false ) {
         event.preventDefault();
         event.stopPropagation();
     }
 }

Vous pouvez voir que jQuery recherche explicitement ret === false .

Mais, il y a aussi beaucoup d'autres endroits dans le code de jQuery où une vérification plus simple est appropriée étant donné le désir du code. Par exemple :

// The DOM ready check for Internet Explorer
function doScrollCheck() {
    if ( jQuery.isReady ) {
        return;
    }
    ...

50voto

karaxuna Points 11303

Si vous écrivez : if(x === true) Il sera vrai pour seulement x = vrai.

Si vous écrivez : if(x) il sera vrai pour tout x qui n'est pas : '' (chaîne vide), false, null, undefined, 0, NaN.

9voto

SLaks Points 391154

En général, il est plus propre et plus simple d'omettre l'élément === true .

Cependant, en Javascript, ces déclarations sont différentes.

if (booleanValue) s'exécutera si booleanValue es véridique - autre chose que 0 , false , '' , NaN , null et undefined .

if (booleanValue === true) ne s'exécutera que si booleanValue est précisément égal à true .

8voto

QuentinUK Points 995

Dans le simple "if", la variable sera convertie en booléen et on utilisera toBoolean sur l'objet : -.

    Argument Type   Result

    Undefined       false
    Null            false
    Boolean         The result equals the input argument (no conversion).
    Number          The result is false if the argument is +0, 0, or NaN;
                    otherwise the result is true.
    String          The result is false if the argument is the empty 
                    String (its length is zero); otherwise the result is true.
    Object          true.

Mais la comparaison avec === n'a pas de coercition de type, donc ils doivent être égaux sans coercition.

Si vous dites que l'objet n'est peut-être même pas un booléen, alors vous devez considérer plus que le simple vrai/faux.

if(x===true){
...
} else if(x===false){
....
} else {
....
}

5voto

Ven Points 7349

Cela dépend de votre cas d'utilisation. Il peut être utile de vérifier le type également, mais si c'est juste un drapeau, ce n'est pas le cas.

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