Primero, hablemos de || (OR lógico). Literalmente, solo cuando ambos lados son false se devuelve false; de lo contrario, se devuelve true.

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

Pero, en un sentido más profundo, hay otro panorama. Probemos el siguiente código:

alert(0||1);

Obviamente, sabemos que el 0 anterior significa false, y el 1 posterior significa true, por lo que el resultado anterior debería ser true, pero el resultado real devuelto es 1. Veamos el siguiente código:

alert(2||1);

Sabemos que el 2 anterior es true y el 1 posterior también es true. ¿Cuál es el resultado devuelto? El resultado de la prueba es 2. Continuemos:

alert('a'||1);

De igual manera, el 'a' anterior es true y el 1 posterior también es true; el resultado de la prueba es 'a'. A continuación:

alert(''||1);

Por lo anterior, sabemos que el '' anterior es false y el 1 posterior es true, y el resultado devuelto es 1. Veamos lo siguiente:

alert('a'||0);

El 'a' anterior es true, y el 0 posterior es false; el resultado devuelto es 'a'. Continuemos:

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

El 'a' anterior es true, el 'b' posterior es false; el resultado devuelto es 'a'. Seguimos con lo siguiente:

alert(''||0);

El '' anterior es false, y el 0 posterior también es false; el resultado devuelto es 0.

alert(0||'');

El 0 anterior es false, el '' posterior es false; el resultado devuelto es ''.

Esto significa:

  • 1. Siempre que lo anterior a || sea false, sin importar si lo posterior a || es true o false, se devuelve el valor posterior a ||.
  • 2. Siempre que lo anterior a || sea true, sin importar si lo posterior a || es true o false, se devuelve el valor anterior a ||.

Segundo, hablemos de && (AND lógico). Literalmente, solo cuando ambos lados son true se devuelve true; de lo contrario, se devuelve false.

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

Luego, según la experiencia anterior, veamos el caso en que lo anterior y posterior a && no son solo de tipo booleano.

alert(''&&1);

El resultado devuelve ''. Lo anterior a && es '' que es false, y lo posterior es 1 que es true.

alert(''&&0);

El resultado devuelve ''. Lo anterior a && es '' que es false, y lo posterior es 0 que también es false.

alert('a'&&1);

El resultado devuelve 1. Lo anterior a && es 'a' que es true, y lo posterior es 1 que también es true.

alert('a'&&0);

El resultado devuelve 0. Lo anterior a && es 'a' que es true, y lo posterior es 0 que es false.

alert('a'&&'');

El resultado devuelve ''. Lo anterior a && es 'a' que es true, y lo posterior es '' que es false.

alert(0&&'a');

El resultado devuelve 0. Lo anterior a && es 0 que es false, y lo posterior es 'a' que es true.

alert(0&&'');

El resultado devuelve 0. Lo anterior a && es 0 que es false, y lo posterior es '' que también es false.

Esto significa

  • 1. Siempre que lo anterior a && sea false, sin importar si lo posterior a && es true o false, el resultado devolverá el valor anterior a &&.
  • 2. Siempre que lo anterior a && sea true, sin importar si lo posterior a && es true o false, el resultado devolverá el valor posterior a &&.

Resumamos:

  • 1. Siempre que lo anterior a || sea false, sin importar si lo posterior a || es true o false, el resultado siempre devuelve el valor posterior a ||.
  • 2. Siempre que lo anterior a || sea true, sin importar si lo posterior a || es true o false, el resultado siempre devuelve el valor anterior a ||.
  • 3. Siempre que lo anterior a && sea false, sin importar si lo posterior a && es true o false, el resultado devolverá el valor anterior a &&.
  • 4. Siempre que lo anterior a && sea true, sin importar si lo posterior a && es true o false, el resultado devolverá el valor posterior a &&.

De las dos pruebas anteriores se puede ver que los operadores lógicos || y && siguen el principio de cortocircuito; solo es necesario determinar si lo anterior al símbolo es verdadero o falso para determinar el valor de retorno.

Cabe señalar que la precedencia de && es mayor que la de ||. Prueba a continuación:

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

El resultado devuelto es 1.

Según el principio de reducción al absurdo, supongamos que la precedencia de || no es menor que la de && (aquí se usa "no menor que" para demostrar también el caso en que tienen el mismo nivel).

Según la conclusión (1) que obtuvimos arriba, (1 || 'a') devolverá el valor anterior 1; (1 && 2), según la conclusión (4), debería devolver el valor posterior 2. Esto evidentemente es incorrecto, por lo que se deduce que la precedencia de && es mayor que la de ||.

Dirección de origen: http://www.cnblogs.com/pigtail/archive/2012/03/09/2387486.html