2012-07-18 10 views
18

código de prueba es:¿Por qué el resultado de bool (verdadero) && string es una cadena en javascript?

console.log(true && "abc");//abc 

que me puede decir por qué el resultado es abc?

+0

Ver también: http://stackoverflow.com/q/2587182 – CMS

+1

** Consejo profesional: ** Estos son discutiblemente equivalentes: 'someBoolVar? DoTrue(): DoFalse() 'es lo mismo que' someBoolVar && DoTrue() || DoFalse() 'pero el conocimiento sobre el segundo, hace que sea más fácil escribir otros pseudo operadores en Javascript también: ie. ** coalesce **: 'someVar || defaultValue' –

Respuesta

16

De MDN (Logical Operators) - Logical And (&&):

devoluciones EXPR1 si se puede convertir en false; de lo contrario, devuelve expr2. Por lo tanto, cuando se usa con valores booleanos, & & devuelve verdadero si ambos operandos son verdaderos; de lo contrario, devuelve falso.

true, obviamente, no puede ser evaluada a falso, por lo que el segundo valor es devuelto que es "abc".

6

El operador && en JavaScript es algo diferente que en C o Java o etc. Siempre devuelve el último valor evaluado subexpresión (si la expresión general es cierto — "Truthy" — — o falsa "Falsy") y doesn' t fuerza un resultado booleano. Cuando falla (cuando uno de los valores es "falsy"), entonces el resultado es el valor en bruto, y no la interpretación booleana del valor.

así que es como la siguiente: dado A && B, el intérprete hace lo siguiente:

  1. evaluar la expresión A, dando un V — el valor de A
  2. Sea A B ser el resultado de fundición a V a booleano
  3. Si a B es false, entonces el valor de la && expresión es un V
  4. evaluar la expresión de B, dando B V
  5. Return B V como el valor de la expresión &&.

Así, en una declaración if, la expresión && tiene el mismo efecto como los operadores booleanos de fundición a presión en C o Java, porque la declaración if sí mismo realiza una prueba Truthy/Falsy en el resultado global de la expresión . Sin embargo, cuando se usa solo, es más como "dame el valor de la segunda expresión si es la primera verdad, de lo contrario dame el valor de la primera expresión".

+1

No siempre devuelve el último valor. '(0 && true)' devuelve '0' (el primer valor). – Quentin

+0

@Quentin es por eso que califiqué la declaración con "cuando es verdad o verdad"; por "eso" quise decir toda la expresión. Voy a volver a decirlo sin embargo. – Pointy

+0

@Quentin: Devuelve el último valor mientras se evalúan los operandos del operador lógico. El último que no rompió la evaluación siempre se almacena y devuelve al salir de la evaluación. Así que es tan * somhow * que devuelve el último valor * truthy *. –

1

&& devuelve el lado izquierdo si el lado izquierdo se evalúa como false, de lo contrario, devuelve el tamaño de la mano derecha.

true no es false, por lo que devuelve el lado derecho, que es su cadena.

> 0 && true // LHS is false, return LHS 
0 
> 1 && true // LHS is true, return RHS 
true 
> false && 0 // LHS is false, return LHS 
false 
> true && false // LHS is true, return RHS 
false 
0

Es algo puede "arreglar" que envolviendo la expresión en !!():

!!(true && 'abc'); 
+0

Esto puede ser confuso, porque al hacer la doble negación todavía no está devolviendo el primer operando, sino que convierte 'abc' en booleano al hacer la primera negación (que convierte esta cadena en 'true' ya que no está vacía y lo niega) y luego lo niega nuevamente para obtener el valor correcto. Creo que deberías explicar el razonamiento que hay detrás de que aún se devuelve 'abc', solo en el valor booleano convertido. –

+1

@RobertKoritnik: sí, tal vez "corregir" debería reemplazarse por "lograr". – jAndy

+0

@RobertKoritnik: en realidad, '!!()' devolverá 'true' si todas las condiciones combinadas con' && 'son' true'. De lo contrario, siempre es 'falso' además de que no tiene que tratar con ningún valor como lo hace OP. – jAndy

Cuestiones relacionadas