2011-12-19 11 views
16

JavaScript es un lenguaje no estrictamente escrito como Java, por ejemplo.Conversión de tipo de JavaScript: (true && 1) vs (true | | 1)

Como sabemos, convierte el valor del resultado de forma dependiente del contexto:

"2" + "3" resultados "23"

"2" * "3" resultados 6

Esto es muy claro y bien para la comprensión.

Sólo traté siguientes expresiones y se confundió:

true && 1 resultados 1
true || 1 resultados true

¿Por qué la primera da Número y la segunda da booleano?

Considerando las reglas de conversión de JavaScript, espero obtener valores de boolean en ambos casos, debido al contexto de expresión boolean.

Respuesta

8

Comprobar Douglas Crockford's site, que dice:

El operador & & que comúnmente se llama lógica y. También se puede llamar guardia. Si el primer operando es falso, nulo, indefinido, "" (el string vacío), o el número 0, entonces devuelve el primer operando. De lo contrario, devuelve el segundo operando. Esto proporciona una manera conveniente para escribir un nulo-cheque:

var value = p && p.name; /* The name value will only be retrieved from 
p if p has a value, avoiding an error. */ 

La || el operador comúnmente es llamado lógico o. También se puede llamar predeterminado. Si el primer operando es falso, nulo, indefinido, "" (la cadena vacía), o el número 0, , entonces devuelve el segundo operando. De lo contrario, devuelve el primer operando . Esto proporciona una manera conveniente para especificar los valores por defecto:

value = v || 10; /* Use the value of v, but if v doesn't have a value, 
use 10 instead. */ 
+0

gracias por la explicación - es un punto interesante sobre la guardia y el valor predeterminado – sergionni

+0

De nada. En general, recomendaría leer la página de Douglas en JavaScript en lugar de la especificación. Es mucho más fácil de entender en mi opinión. http://javascript.crockford.com/ –

+0

¡Gran explicación! Ojalá pudiera darte +3. –

9

A quote MDC;

&&; Devuelve expr1 si se puede convertir a falso; 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.
||; Devuelve expr1 si se puede convertir a verdadero; de lo contrario, devuelve expr2. Por lo tanto, cuando se usa con valores booleanos, || devuelve verdadero si cualquiera de los operandos es verdadero; si ambos son falsos, devuelve falso.

Por lo tanto, en el primer ejemplo, 1 se devuelve porque expr1 no se puede convertir en falso.

En el segundo ejemplo, true se puede convertir en verdadero, por lo que se devuelve.

+0

muchas gracias, en realidad me recuerda, ese recurso Mozilla es muy valioso como documentación de JavaScript – sergionni

0

Puede hacer otras cosas también, como:

var myVar = Math.random() > 0.5; 

myVar && doFunc(); 

que es el mismo que

if(myVar) { 
    doFunc(); 
} 

El || básicamente significa "Si lo primero es falsa, ir a la segunda"

El && básicamente significa "Si lo primero es cierto, vaya al segundo"

Esto es por eso que ver cosas como esta en la parte superior de las funciones:

function myFunction(options) { 
    options = options || {}; 
} 

Lo que significa que: Si las opciones es Falsey-, hacen que sea {}

9

Esto no tiene nada que ver con la conversión de tipos.

|| devuelve el primer operando de verdad. 1 || true le dará 1

&& devuelve el primer operando de falsy, o el segundo operando si ambos son verdaderos.

Consulte la página 58 de la ECMAScript specification

+0

gracias, nunca se sabe sobre el enfoque de "primera pasada" – sergionni

0

Estás confundiendo el casting (los operadores */+ lo harán) con evaluación lógica (que & &, ||) do.

+0

puede obtener su respuesta – sergionni