Qu'est-ce que l'opérateur double tuyau ( ||)?
L'opérateur double pipe ( ||) est l' opérateur logiqueOR . Dans la plupart des langues, cela fonctionne de la manière suivante:
- Si la première valeur est
false, il vérifie la deuxième valeur. S'il l'est true, il revient trueet s'il l'est false, il revient false.
- Si la première valeur est
true, elle revient toujours true, quelle que soit la seconde valeur.
Donc, fondamentalement, cela fonctionne comme cette fonction:
function or(x, y) {
if (x) {
return true;
} else if (y) {
return true;
} else {
return false;
}
}
Si vous ne comprenez toujours pas, regardez ce tableau:
| true false
------+---------------
true | true true
false | true false
En d'autres termes, ce n'est faux que lorsque les deux valeurs sont fausses.
En quoi est-ce différent en JavaScript?
JavaScript est un peu différent, car c'est un langage peu typé . Dans ce cas, cela signifie que vous pouvez utiliser l' ||opérateur avec des valeurs qui ne sont pas booléennes. Bien que cela n'ait aucun sens, vous pouvez utiliser cet opérateur avec par exemple une fonction et un objet:
(function(){}) || {}
Que se passe-t-il là?
Si les valeurs ne sont pas booléennes, JavaScript effectue une conversion implicite en booléen . Cela signifie que si la valeur est Falsey (par exemple 0, "", null, undefined(voir aussi toutes les valeurs de Falsey en JavaScript )), il sera considéré comme false; sinon, il est traité comme true.
Donc l'exemple ci-dessus devrait donner true, car la fonction vide est véridique. Et bien non. Il renvoie la fonction vide. C'est parce que l' ||opérateur de JavaScript ne fonctionne pas comme je l'ai écrit au début. Cela fonctionne de la manière suivante:
- Si la première valeur est falsey , elle renvoie la deuxième valeur .
- Si la première valeur est véridique , elle renvoie la première valeur .
Surpris? En fait, il est "compatible" avec l' ||opérateur traditionnel . Il pourrait être écrit comme la fonction suivante:
function or(x, y) {
if (x) {
return x;
} else {
return y;
}
}
Si vous passez une valeur véridique as x, cela renvoie x, c'est-à-dire une valeur véridique. Donc, si vous l'utilisez plus tard dans la ifclause:
(function(x, y) {
var eitherXorY = x || y;
if (eitherXorY) {
console.log("Either x or y is truthy.");
} else {
console.log("Neither x nor y is truthy");
}
}(true/*, undefined*/));
vous obtenez "Either x or y is truthy.".
Si xc'était Falsey, ce eitherXorYserait y. Dans ce cas, vous obtiendrez le "Either x or y is truthy."si yétait vrai; sinon vous auriez "Neither x nor y is truthy".
La vraie question
Maintenant, quand vous savez comment ||fonctionne l'opérateur, vous pouvez probablement comprendre par vous-même ce que cela x = x || ysignifie. Si xest véridique, xest affecté à x, donc en réalité rien ne se passe; sinon yest affecté à x. Il est couramment utilisé pour définir les paramètres par défaut dans les fonctions. Cependant, il est souvent considéré comme une mauvaise pratique de programmation , car il vous empêche de passer une valeur de falsey (qui n'est pas nécessairement undefinedou null) comme paramètre. Prenons l'exemple suivant:
function badFunction(/* boolean */flagA) {
flagA = flagA || true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
Il semble valide à première vue. Cependant, que se passerait-il si vous passiez falseen flagAparamètre (car c'est booléen, c'est-à-dire peut être trueou false)? Cela deviendrait true. Dans cet exemple, il n'y a aucun moyen de définir flagAsur false.
Ce serait une meilleure idée de vérifier si explicitement flagAest undefined, comme ça:
function goodFunction(/* boolean */flagA) {
flagA = typeof flagA !== "undefined" ? flagA : true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
Bien qu'il soit plus long, il fonctionne toujours et il est plus facile à comprendre.
Vous pouvez également utiliser la syntaxe ES6 pour les paramètres de fonction par défaut , mais notez qu'elle ne fonctionne pas dans les navigateurs plus anciens (comme IE). Si vous souhaitez prendre en charge ces navigateurs, vous devez transpiler votre code avec Babel .
Voir aussi Opérateurs logiques sur MDN .
falsy, pas JUSTEundefined. Le nombre de fois que j'ai vudoWeDoIt = doWeDoIt || truesuffit à me faire pleurer. (c'est-àdoWeDoIt- dire qu'il ne le sera plusfalse)