55 votes

Pourquoi les opérateurs logiques (&& et ||) ne renvoient-ils pas toujours un résultat booléen ?

Pourquoi ces opérateurs logiques renvoient-ils un objet et non un booléen ?

var _ = (obj.fn && obj.fn() ) || obj._ || ( obj._ = {} );

var _ = obj && obj._;

Je veux comprendre pourquoi il renvoie le résultat de obj.fn() (si elle est définie) OU obj._ mais pas de résultat booléen.

3voto

Je pense que vous avez une question de méthodologie JavaScript de base ici.

Or, JavaScript est un langage faiblement typé. En tant que tel, la manière dont il traite les opérations logiques diffère de celle d'autres langages standard comme Java et C++. JavaScript utilise un concept connu sous le nom de "coercition de type" pour déterminer la valeur d'une opération logique et renvoie toujours la valeur du premier élément de l'opération logique. true type. Par exemple, regardez le code ci-dessous :

var x = mystuff || document;
// after execution of the line above, x = document

Cela s'explique par le fait que mystuff est un a priori entité indéfinie qui sera toujours évaluée à false lorsqu'il est testé et, en tant que tel, JavaScript le saute et teste l'entité suivante pour une true valeur. Puisque l'objet document est connu de JavaScript, il retourne une valeur true et JavaScript renvoie cet objet.

Si vous vouliez qu'une valeur booléenne vous soit renvoyée, vous devriez passer votre déclaration de condition logique à une fonction de la manière suivante :

var condition1 = mystuff || document;

function returnBool(cond){
  if(typeof(cond) != 'boolean'){ //the condition type will return 'object' in this case
     return new Boolean(cond).valueOf();
  }else{ return; }
}    
// Then we test...
var condition2 = returnBool(condition1);
window.console.log(typeof(condition2)); // outputs 'boolean'

2voto

IcyBrk Points 422

Nous pouvons nous référer à la spec(11.11) de JS ici de :

Sémantique

La production LogicalANDExpression :LogicalANDExpression &&BitwiseORExpression est évaluée comme suit :

  1. Évaluer l'expression LogicalANDE.

Appelez GetValue(Résultat(1)).

Appeler ToBoolean(Resultat(2)).

Si le résultat(3) est faux, renvoyer le résultat(2).

5. évaluer l'expression BitwiseORE.

Appelez GetValue(Résultat(5)).

7.Retourner le résultat(6).

voir aquí pour la spécification

1voto

Quentin Points 325526

Tout d'abord, il doit être vrai pour revenir, donc si vous testez la véracité, cela ne fait aucune différence.

Deuxièmement, il vous permet de faire des missions du type :

function bar(foo) {
    foo = foo || "default value";

1voto

Christophe Points 7878

Comparez :

var prop;
if (obj.value) {prop=obj.value;}
else prop=0;

avec :

var prop=obj.value||0;

Le fait de renvoyer une expression vraie - plutôt que juste vrai ou faux - rend généralement votre code plus court et toujours lisible. C'est très courant pour ||, moins pour &&.

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