Tout d'abord, parlons de || (OU logique). Littéralement, il renvoie false uniquement lorsque les deux côtés sont false ; sinon, il renvoie true.

alert(true||false);       // true
alert(false||true);       // true
alert(true||true);        // true
alert(false||false);      // false

Cependant, dans un sens plus profond, il y a une autre histoire. Essayez le code suivant :

alert(0||1);

Évidemment, nous savons que le 0 précédent signifie false, et le 1 suivant signifie true, donc le résultat ci-dessus devrait être true, mais le résultat réellement renvoyé est 1. Regardez le code ci-dessous :

alert(2||1);

Nous savons que le 2 précédent est true, et le 1 suivant est aussi true. Alors quel est le résultat renvoyé ? Le résultat du test est 2. Continuez :

alert('a'||1);

De même, le 'a' précédent est true, et le 1 suivant est aussi true ; le résultat du test est 'a'. Ci-dessous :

alert(''||1);

D'après ce qui précède, nous savons que le '' précédent est faux, et que le 1 suivant est vrai, et que le résultat renvoyé est 1. Regardez ci-dessous :

alert('a'||0);

Le 'a' précédent est vrai, tandis que le 0 suivant est faux, donc le résultat renvoyé est 'a'. Continuez ci-dessous :

alert('a'||'b');

Le 'a' précédent est vrai, et le 'b' suivant est faux, donc le résultat renvoyé est 'a'. Nous continuons ci-dessous :

alert(''||0);

Le '' précédent est faux, et le 0 suivant est aussi faux, donc le résultat renvoyé est 0.

alert(0||'');

Le 0 précédent est faux, et le '' suivant est faux, donc le résultat renvoyé est ''.

Cela signifie :

  • 1. Tant que la valeur avant || est fausse, peu importe que la valeur après || soit vraie ou fausse, elle renvoie la valeur après ||.
  • 2. Tant que la valeur avant || est vraie, peu importe que la valeur après || soit vraie ou fausse, elle renvoie la valeur avant ||.

Deuxièmement, parlons de && (ET logique). Littéralement, il renvoie vrai uniquement lorsque les deux côtés sont vrais ; sinon, il renvoie faux.

alert(true&&false);      // false
alert(true&&true);       // true
alert(false&&false);     // false
alert(false&&true);      // false

Ensuite, d'après l'expérience ci-dessus, examinons les cas où les valeurs avant et après && ne sont pas uniquement de type booléen.

alert(''&&1);

Le résultat renvoie ''. La valeur avant && est '' (fausse), et la valeur après est 1 (vraie).

alert(''&&0);

Le résultat renvoie ''. La valeur avant && est '' (fausse), et la valeur après est 0 (également fausse).

alert('a'&&1);

Le résultat renvoie 1. La valeur avant && est 'a' (vraie), et la valeur après est 1 (également vraie).

alert('a'&&0);

Le résultat renvoie 0. La valeur avant && est 'a' (vrai), et la valeur après est 0 (faux).

alert('a'&&'');

Le résultat renvoie ''. La valeur avant && est 'a' (vrai), et la valeur après est '' (faux).

alert(0&&'a');

Le résultat renvoie 0. La valeur avant && est 0 (faux), et la valeur après est 'a' (vrai).

alert(0&&'');

Le résultat renvoie 0. La valeur avant && est 0 (faux), et la valeur après est '' (également faux).

Cela signifie :

  • 1. Tant que la valeur avant && est fausse, que la valeur après && soit vraie ou fausse, le résultat renverra la valeur avant &&.
  • 2. Tant que la valeur avant && est vraie, que la valeur après && soit vraie ou fausse, le résultat renverra la valeur après &&.

Résumons :

  • 1. Tant que la valeur avant || est fausse, que la valeur après || soit vraie ou fausse, le résultat renvoie la valeur après ||.
  • 2. Tant que la valeur avant || est vraie, que la valeur après || soit vraie ou fausse, le résultat renvoie la valeur avant ||.
  • 3. Tant que la valeur avant && est fausse, que la valeur après && soit vraie ou fausse, le résultat renverra la valeur avant &&.
  • 4. Tant que la valeur avant && est vraie, que la valeur après && soit vraie ou fausse, le résultat renverra la valeur après &&.

D'après les deux tests ci-dessus, les opérateurs logiques || et && suivent tous deux le principe de court-circuit. Tant que la valeur de vérité de la valeur avant le symbole est déterminée, la valeur de retour peut être déterminée.

Il convient de noter que && a une priorité plus élevée que ||. Test ci-dessous :

alert(1||'a'&&2);

Le résultat renvoyé est 1.

Selon le principe de preuve par l'absurde, nous supposons que la priorité de || n'est pas inférieure à && (la raison d'utiliser « non inférieure » ici est de prouver aussi le cas où elles ont la même priorité).

D'après la conclusion (1) que nous avons dérivée ci-dessus, (1 || 'a') renverra la valeur précédente 1 ; d'après la conclusion (4), (1 && 2) devrait renvoyer la valeur suivante 2. Ceci est manifestement incorrect. De cela, nous pouvons voir que && a une priorité plus élevée que ||.

URL source : http://www.cnblogs.com/pigtail/archive/2012/03/09/2387486.html