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 true
et 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 if
clause:
(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 x
c'était Falsey, ce eitherXorY
serait 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 || y
signifie. Si x
est véridique, x
est affecté à x
, donc en réalité rien ne se passe; sinon y
est 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 undefined
ou 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 false
en flagA
paramètre (car c'est booléen, c'est-à-dire peut être true
ou false
)? Cela deviendrait true
. Dans cet exemple, il n'y a aucun moyen de définir flagA
sur false
.
Ce serait une meilleure idée de vérifier si explicitement flagA
est 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 || true
suffit à me faire pleurer. (c'est-àdoWeDoIt
- dire qu'il ne le sera plusfalse
)