Pourquoi ne pas les opérateurs logiques (&& et ||) retourne toujours un résultat booléen?
Pourquoi ces opérateurs logiques retourne un objet et pas un booléen?
var _ = (obj.fn && obj.fn() ) || obj._ || ( obj._ = {} );
var _ = obj && obj._;
Je veux comprendre pourquoi, elle renvoie le résultat de obj.fn()
(si elle est définie) OU obj._
mais pas de résultat booléen.
- Je pense qu'il veut savoir pourquoi
a || b
ne pas retourner un booléen maisa
oub
. - Ne pas
var _ = obj && obj._;
retourner un booléen? O. o / Alors, que fait-il de retour? La première évaluation comme faux evt. le dernier vrai si tous sont remplies? - ThiefMaster, c'est exactement ce que je voulais dire. J'ai mis à JOUR mon post
- et que fait votre
obj.fn()
de retour et qu'est-ce que (type)obj.fn
- La réponse ici stackoverflow.com/questions/2851404/...
- jetez un oeil à la mise à jour
- C'est comment
&&
et||
travail se fait en JavaScript. Ils retournent les arguments et non une valeur Booléenne. .... Pourquoi demandez-vous? Parce que Brendan Eich dit!
Vous devez vous connecter pour publier un commentaire.
sera de retour booléen.
Mise à JOUR
Noter que ceci est basé sur mes tests. Je ne suis pas pour être totalement fiable.
C'est une expression qui ne pas attribuer
true
oufalse
valeur. Plutôt, il assigne la valeur calculée.Jetons un coup d'oeil à cette expression.
Un exemple d'expression:
Votre expression:
Une autre expression:
Une autre expression:
En JavaScript, les deux
||
et&&
sont logiques de court-circuit opérateurs de retour de la première entièrement déterminé “valeur logique” lorsqu'elles sont évaluées de gauche à droite.Dans l'expression
X || Y
,X
est évalué en premier, et interprété comme une valeur booléenne. Si cette valeur booléenne est “vrai”, alors il est retourné. EtY
n'est pas évalué. (Car il n'a pas d'importance siY
est vrai ouY
est faux,X || Y
a été entièrement déterminé.) C'est le court-circuit de la partie.Si cette valeur booléenne est “faux”, alors nous ne savons pas encore si
X || Y
est vrai ou faux jusqu'à ce que nous évaluonsY
, et de l'interpréter comme une valeur booléenne ainsi. AlorsY
revient.Et
&&
fait la même chose, sauf qu'il s'arrête à évaluer si le premier argument est faux.La première partie délicate est que lorsqu'une expression est évaluée comme “vrai”, alors l'expression elle-même est retourné. Qui est considéré comme "vrai" dans des expressions logiques, mais vous pouvez aussi l'utiliser. Donc, c'est pourquoi vous voyez des valeurs réelles de l'être retourné.
La deuxième partie délicate est que quand une expression est évaluée comme “faux”, puis en JS 1.0 et 1.1 le système renvoie une valeur booléenne “false”; considérant qu'en JS 1.2 sur elle renvoie la valeur réelle de l'expression.
En JS
false
,0
,-0
,""
,null
,undefined
,NaN
etdocument.all
tous sont considérés comme false.Ici, je suis, bien sûr, citant des valeurs logiques pour la discussion du saké. Bien sûr, la chaîne littérale
"false"
n'est pas la même que la valeurfalse
, et est donc vrai.Dans les termes les plus simples:
La
||
opérateur retourne la première truthy valeur, et si aucun n'est truthy, il retourne la dernière valeur (qui est un falsy valeur).La
&&
opérateur retourne la première falsy valeur, et si aucun n'est falsy, il retourne la dernière valeur (qui est un truthy valeur).C'est vraiment aussi simple que cela. Expérience dans votre console pour voir par vous-même.
JS:
Je pense que vous avez le code JavaScript de base de la méthodologie de question ici.
Maintenant, JavaScript est un langage faiblement typé. En tant que tel, de la façon et de la manière dont elle traite les opérations logiques diffère de celle des autres langages comme Java et C++. JavaScript utilise le concept de contrainte de type" pour déterminer la valeur d'une opération logique et renvoie toujours la valeur de la première
true
type. Par exemple, regardez le code ci-dessous:C'est parce que
mystuff
est un a priori undefined entité qui sera toujours l'évaluer àfalse
lorsqu'il est testé et en tant que tel, JavaScript ignore ce et tests de la prochaine entité pour unetrue
valeur. Depuis l'objet document est connu pour JavaScript, il renvoie unetrue
valeur et JavaScript renvoie cet objet.Si vous vouliez une valeur booléenne retourné à vous, vous avez passer votre logique de l'état à une fonction comme ceci:
!!condition1
est un moyen beaucoup plus simple d'obtenir un booléentrue
oufalse
à partir d'un truthy ou falsy résultat.Nous pouvons nous référer à la spécification(11.11) de JS ici:
Sémantique
La production LogicalANDExpression :LogicalANDExpression &&BitwiseORExpression est évaluée comme suit:
2.Appel GetValue(Résultat(1)).
3.Appel ToBoolean(Résultat(2)).
4.Si le Résultat(3) est faux, Résultat de retour(2).
5.Évaluer BitwiseORExpression.
6.Appel GetValue ((5)).
7.Résultat De Retour(6).
voir ici pour la spec
Dans la plupart des langages de programmation, le
&&
et||
opérateurs retourne un booléen. En JavaScript, c'est différent.OU de l'Exploitant:
Elle renvoie la valeur de la premier opérande qui valide comme vrai (le cas échéant), sinon, elle retourne la valeur de la dernier opérande (même si il valide comme faux).
Exemple 1:
Exemple 2:
ET Exploitant:
Elle renvoie la valeur de la dernier opérande qui valide comme vrai (si toutes les conditions valide comme vrai), sinon, elle retourne la valeur de la premier opérande qui valide comme faux.
Exemple 1:
Exemple 2:
Conclusion:
Si vous voulez JavaScript pour agir de la même façon d'autres langages de programmation, utiliser
Boolean()
fonction, comme ceci:Tout d'abord, il doit être vrai pour le retour, donc si vous testez la véracité alors il ne fait aucune différence
Deuxième, il vous permet de faire des affectations le long des lignes de:
Comparer:
avec:
Retour d'un truthy de l'expression plutôt que de simplement vrai ou faux - habituellement rend votre code plus court et toujours lisible. Ceci est très fréquent pour ||, non pas tant pour &&.