Compte tenu de cet extrait de JavaScript ...
var a;
var b = null;
var c = undefined;
var d = 4;
var e = 'five';
var f = a || b || c || d || e;
alert(f); // 4
Quelqu'un peut-il m'expliquer comment s'appelle cette technique (ma meilleure estimation se trouve dans le titre de cette question!)? Et comment / pourquoi ça marche exactement?
Ma compréhension est que la variable se f
verra attribuer la valeur la plus proche (de gauche à droite) de la première variable qui a une valeur qui n'est ni nulle ni indéfinie, mais je n'ai pas réussi à trouver beaucoup de matériel de référence sur cette technique et à avoir vu qu'il a utilisé beaucoup.
De plus, cette technique est-elle spécifique à JavaScript? Je sais que faire quelque chose de similaire en PHP aurait pour résultat d' f
avoir une vraie valeur booléenne, plutôt que la valeur d' d
elle - même.
$f=$a or $f=$b or $f=$c; // etc
. PHP a à la fois l'||
opérateur et l'or
opérateur, qui font le même travail; cependantor
est évalué après l' affectation tandis que||
est évalué avant. Cela vous donne également le style perlish de$a=getSomething() or die('oops');
$f = $a ?: $b ?: $c;
??
pour cela.$a = $b ?? 'default'
$a
verra donc attribuer la valeur de$b
si$b
est vrai, autre'default'
?Réponses:
Voir l' évaluation des courts-circuits pour l'explication. C'est une façon courante de mettre en œuvre ces opérateurs; il n'est pas propre à JavaScript.
la source
if( true == f )
. Si un entier a été stocké dans f, ce test retournera toujours faux.if(true == f)
, ce qui revient au mêmeif(f)
: le test passera. Si vous souhaitez également tester le type def
, utilisez une comparaison stricte:,if(true === f)
qui échouera en effet.Ceci est fait pour assigner une valeur par défaut , dans ce cas la valeur de
y
, si lax
variable est fausse .Les opérateurs booléens en JavaScript peuvent renvoyer un opérande, et pas toujours un résultat booléen comme dans d'autres langues.
L'opérateur OU logique (
||
) renvoie la valeur de son deuxième opérande, si le premier est faux, sinon la valeur du premier opérande est renvoyée.Par exemple:
Falsy valeurs sont celles qui contraignent à
false
quand il est utilisé dans le contexte booléen, et ils sont0
,null
,undefined
, une chaîne vide,NaN
et bien sûrfalse
.la source
||
exclusif.&&
opérateur logique a un comportement similaire, il renvoie la valeur du premier opérande s'il est lui-même faux et renvoie la valeur du deuxième opérande, uniquement si le premier est véridique , par exemple("foo" && "bar") == "bar"
et(0 && "bar") == 0
Javacript utilise l'évaluation des courts-circuits pour les opérateurs logiques
||
et&&
. Cependant, il est différent des autres langages en ce qu'il retourne le résultat de la dernière valeur qui a interrompu l'exécution, au lieu d'une valeurtrue
oufalse
.Les valeurs suivantes sont considérées comme fausses en JavaScript.
""
(chaîne vide)En ignorant les règles de priorité des opérateurs et en gardant les choses simples, les exemples suivants montrent quelle valeur a interrompu l'évaluation et est retournée en conséquence.
Les 5 premières valeurs jusqu'à
NaN
sont fausses donc elles sont toutes évaluées de gauche à droite, jusqu'à ce qu'elle rencontre la première valeur véridique -"Hello"
ce qui rend toute l'expression vraie, donc tout ce qui est plus haut ne sera pas évalué et sera"Hello"
renvoyé à la suite de l'expression . De même, dans ce cas:Les 5 premières valeurs sont toutes véridiques et sont évaluées jusqu'à ce qu'elles rencontrent la première valeur falsifiée (
null
), ce qui rend l'expression fausse, elle2010
n'est donc plus évaluée etnull
est renvoyée à la suite de l'expression.L'exemple que vous avez donné utilise cette propriété de JavaScript pour effectuer une affectation. Il peut être utilisé partout où vous avez besoin d'obtenir la première valeur véridique ou fausse parmi un ensemble de valeurs. Ce code ci-dessous attribuera la valeur
"Hello"
àb
car il facilite l'attribution d'une valeur par défaut, au lieu de faire des vérifications if-else.Vous pouvez appeler l'exemple ci-dessous une exploitation de cette fonctionnalité, et je pense que cela rend le code plus difficile à lire.
À l'intérieur de l'alerte, nous vérifions si
messages
c'est faux, et si oui, évaluons et retournonsnoNewMessagesText
, sinon évaluons et retournonsnewMessagesText
. Comme c'est faux dans cet exemple, nous nous arrêtons à noNewMessagesText et alertons"Sorry, you have no new messages."
.la source
However, it's different to other languages in that it returns the result of the last value that halted the execution, instead of a true, or false value.
Les variables Javascript ne sont pas typées, donc f peut se voir attribuer une valeur entière même si elle a été attribuée via des opérateurs booléens.
f reçoit la valeur la plus proche qui n'est pas équivalente à false . Donc 0, faux, null, non défini, sont tous passés:
la source
''
également faux égal dans ce cas.f is assigned the NEAREST value
qui est un point assez important ici.||
opérateur booléen , étant un opérateur booléen, a deux opérandes: un côté gauche et un côté droit. Si le côté gauche du||
est vrai , l'opération se résout au côté gauche et le côté droit est ignoré. Si le côté gauche est faux , il se résout au côté droit. Donc,null || undefined || 4 || 0
se résout réellement àundefined || 4 || 0
qui se résout à4 || 0
qui se résout4
.Il n'y a pas de magie. Les expressions booléennes comme
a || b || c || d
sont paresseusement évaluées. Interpeter recherche la valeur dea
, elle n'est pas définie, elle est donc fausse alors elleb
continue , puis elle voit ce qui est nul, ce qui donne toujours un résultat faux alors elle continue, puis elle voitc
- même histoire. Enfin, il voitd
et dit «hein, ce n'est pas nul, j'ai donc mon résultat» et il l'assigne à la variable finale.Cette astuce fonctionnera dans tous les langages dynamiques qui effectuent une évaluation par court-circuit paresseux des expressions booléennes. Dans les langages statiques, il ne se compile pas (erreur de type). Dans les langages désireux d'évaluer des expressions booléennes, il retournera une valeur logique (c'est-à-dire vrai dans ce cas).
la source
d
sera attribué qu'il soit nul / non défini ou non.||
opérateur se résout toujours à tout l'opérande du côté droit lorsque le côté gauche est faux. Étant un opérateur booléen, il ne voit que deux entrées: le côté gauche et le côté droit. L'analyseur ne les considère pas comme une série de termes, donc il ne s'arrête pas réellement lorsqu'il trouve la première valeur véridique à moins que cette valeur ne soit également l'opérande gauche d'un autre||
.Cette question a déjà reçu plusieurs bonnes réponses.
En résumé, cette technique tire parti d'une caractéristique de la façon dont le langage est compilé. Autrement dit, JavaScript «court-circuite» l'évaluation des opérateurs booléens et renvoie la valeur associée à la première valeur de variable non fausse ou à ce que contient la dernière variable. Voir l'explication d'Anurag de ces valeurs qui seront évaluées comme fausses.
L'utilisation de cette technique n'est pas une bonne pratique pour plusieurs raisons; toutefois.
Fonctionnalités documentées: Il existe une alternative existante qui répond à ce besoin et est cohérente dans plusieurs langues. Ce serait l'opérateur ternaire:
()? valeur 1: valeur 2.
L'utilisation de l'opérateur ternaire nécessite un peu plus de frappe, mais il distingue clairement entre l'expression booléenne évaluée et la valeur attribuée. De plus, il peut être chaîné, de sorte que les types d'affectations par défaut exécutées ci-dessus pourraient être recréés.
la source
potentially be targeted for change in the future.
oui, mais ce n'est pas le cas pour le javascript.a || b || c || d || e
?Renvoie la première valeur vraie de la sortie .
Si tous sont faux, retournez la dernière fausse valeur.
Exemple:-
la source
Il définit la nouvelle variable (
z
) à la valeur dex
si elle est "véridique" (non nulle, un objet / tableau / fonction valide / quoi que ce soit) ouy
autre. C'est une façon relativement courante de fournir une valeur par défaut au cas où ilx
n'existe pas.Par exemple, si vous avez une fonction qui prend un paramètre de rappel facultatif, vous pouvez fournir un rappel par défaut qui ne fait rien:
la source
Cela signifie que si
x
est défini, la valeur dez
serax
, sinon siy
est défini, sa valeur sera définie comme laz
valeur de.c'est la même chose que
C'est possible parce que les opérateurs logiques en JavaScript ne renvoient pas de valeurs booléennes mais la valeur du dernier élément nécessaire pour terminer l'opération (dans une phrase OU ce serait la première valeur non fausse, dans une phrase ET ce serait la dernière ). Si l'opération échoue, elle
false
est renvoyée.la source
||
opérateur renvoie simplement la deuxième valeur, qu'elle soit véridique ou non.z
est défini sur la valeur dex
si cette valeur est véridique . Sinon, il prend la valeur dey
. Cela signifie que six
est défini sur, par exemple,0
ou sur la chaîne vide""
, cela ne fait pas ce que vous dites, car ces valeurs sont fausses .Son appelé opérateur de court-circuit.
L'évaluation de court-circuit indique que le deuxième argument n'est exécuté ou évalué que si le premier argument ne suffit pas pour déterminer la valeur de l'expression. lorsque le premier argument de la fonction OR (||) est évalué à vrai, la valeur globale doit être vraie.
Il pourrait également être utilisé pour définir une valeur par défaut pour l'argument de la fonction. »
la source
Il évaluera X et, si X n'est pas nul, la chaîne vide ou 0 (faux logique), il l'affectera à z. Si X est nul, la chaîne vide ou 0 (faux logique), alors il attribuera y à z.
Sortira «bob»;
la source
false
, mais les tableaux ou objets vides se contraignenttrue
.Selon le blog de Bill Higgins ; l'idiome d'affectation OU logique Javascript (février 2007), ce comportement est vrai à partir de la version 1.2 (au moins)
Il suggère également une autre utilisation (citée): " normalisation légère des différences entre navigateurs "
la source