2011-03-22 11 views
6

¿Por qué document.writeln("a" || "b") imprime a en lugar de true?¿Por qué document.writeln ("a" || "b") imprime "a" intead de "true"?

document.writeln("a" && "b") impresiones b

document.writeln(1==1 && 1!=1) grabados false

document.writeln(1!=1 && 'b') impresiones false

document.writeln(1==1 && 'b') grabados b

¿Tiene que evalúan la parte interior y devuelven el último valor de &&, y la primera verdadera valor para ||?

+0

¿Por qué imprimiría cierto? "a" es una cadena no en blanco definida, por lo que es cierta y, por lo tanto, se devuelve al método. También 1 == 1 será evaluado, mejor usar 1 === 1 que no arrojará las entradas a las cadenas – mplungjan

+2

Me gusta este comportamiento, y para ser honesto, ni siquiera lo consideré de antemano. –

Respuesta

9

|| y && no siempre devuelven booleanos. || evalúa el primer argumento. Si se evalúa como verdadero, devuelve ese argumento. De lo contrario, devuelve el segundo argumento (incondicionalmente).

&& evalúa el primer argumento. Si se evalúa como verdadero, devuelve el segundo argumento (incondicionalmente). De lo contrario, devuelve el primer argumento.

Esto le permite hacer algunas cosas interesantes como:

function foo(optionalVar) { 
    var x = optionalVar || 4; 
} 
foo(10); //uses 10, since it is passed in; 
foo(); //uses 4, the default value, since optionalVar=undefined, which is false 
+0

primero vi esto en un poco de código como el ejemplo que proporcionó. – Shawn

2

Su orden de las operaciones y las tablas de verdad.

If(a OR b) : if a is true than the whole statement is true 
If(a AND b): if a is true, doesnt mean that the statement is true, 
      but if b is true as well than the statement is true 
|| is the same as OR 
&& is the same as AND 

ACTUALIZACIÓN
Así que en la programación funcional que devuelve la primeratrue valor . una cadena se considera true por lo que devolvería la cadena.

Pointy señaló:
La cadena vacía, cabe señalar, es notrue. (Lo que quiere decir, por supuesto, que es false)

+1

La cadena vacía, debe tenerse en cuenta, es ** no ** 'verdadera'. (Lo que quiere decir, por supuesto, que es 'falso'.) – Pointy

+0

cambió mi respuesta para reflejar mejor – Neal

Cuestiones relacionadas