2010-01-11 22 views

Respuesta

8

la expresión se evalúa a myvar si myvar es Falsey, y foo() si myvar es Truthy. Los siguientes fragmentos son casi idénticos. función

var x = (myvar && foo()); 

if(myvar){ var x = foo(); } else { var x = myvar; } 
4

es una expresión que equivale a "si myVar no es falsey, ejecute la función foo()". Si se usa así: var x = (myVar && foo()), el resultado será:

si myVar no es falsey, x se configurará en la salida de foo(). si myVar es falsey, entonces x se establecerá en el valor de myVar.

+0

Si mivar es x Truthy no se establece la verdadera, su conjunto de la valor de foo(), sea lo que sea. – brad

+0

Esto no es del todo correcto. Si myVar es 0, entonces x se establece en 0, no es falso. –

+0

Ambos son correctos. Respuesta enmendada – glomad

1

La expresión está haciendo un uso inteligente del cortocircuito en expresiones booleanas. foo() solo se ejecutará si myVar evalúa a true.

if (myVar) { 
    foo(); 
} 

es mucho más claro. Es probable que haya casos en los que este tipo de código tenga sentido, pero los inspectores de estilo (si está interesado en ese tipo de cosas) le darán un ataque. Ver http://javascript.crockford.com/code.html. Es una buena práctica evitar confiar en las declaraciones de inserción y expresión de punto y coma.

editar: Tenga en cuenta que var x = a && b(); probablemente no sea una mala idea en ciertos contextos. Sin embargo, (a && b()) por sí mismo está mal de varias maneras. (Inserción punto y coma, declaración de la expresión, además de ser semánticamente críptico)

+2

Vi esto en una secuencia de comandos jquery (diálogo ui) ... – Val

+2

"Explotar" "estúpido" esas son algunas palabras fuertes :) Si usa mucho JS, tiene sentido y es claro como está. –

+3

Ciertamente existen circunstancias en las que dicho código no es estúpido por ninguna medida razonable. Tal como en el contexto de 'if (enabled && isVisible()) ...' o alguna situación similar. – Grumdrig

3

El foo() sólo será llamado si no es miVar Falsey-: lo que significa que no puede ser falsa, "", 0, null o no definida. (Algún otro?)

Es más típico ver un ejemplo como este:

window.console && console.log("some helpful debug info"); 

Esto se interpreta de la siguiente manera ...

"Si la variable de la 'ventana' tiene un elemento llamado" consola' ... '

(es importante prefijo 'consola' con 'ventana.', ya que, si la consola no está definido, obtendrá un error de JavaScript en lugar de falsa.)

' ... en activar el método 'log' en el objeto 'consola'. "

+1

* "¿Hay algún otro?" * Solo -0 y NaN, creo. –

+1

@Jason: '0',' NaN', una cadena de longitud cero, 'undefined',' null' y por supuesto 'false' son * falsy * ... – CMS

+0

Ah, pensé en NaN mientras escribía, pero Olvidé escribirlo ¡Gracias! –

0

cuando & & se evalúan la mano izquierda se evalúa primero es decir myVar, si esto es cierto entonces sólo el lado derecho se evalúa es decir foo(). Esto se debe a que en una declaración A & & B si A es falso, la expresión A & & B siempre evaluará a falso.

La declaración anterior se utiliza generalmente de la siguiente manera:

var x = myVar && foo(); 

esto también se puede escribir como:

if myVar is truee x = foo(), else x = false 
Cuestiones relacionadas