2012-03-06 10 views
8

favor, alguien puede explicar a mí lo que esta línea de código:JavaScript repliegue variable

var list = calls[ev] || (calls[ev] = {}); 

Mi mejor conjetura:

Es el establecimiento de la "lista" variable con el valor de calls.xxx, donde xxx es una variable, ev. Si las llamadas [ev] no existen, entonces lo está creando como un objeto vacío y asignando ese objeto vacío a "lista". ¿Está bien?

¿Por qué se usan los paréntesis? ¿Dónde puedo encontrar más información sobre el uso de || cuando se establecen variables, y el uso de paréntesis en este contexto? ¡Gracias!

+0

Los paréntesis garantizan la correcta evaluación de la expresión, porque '||' tiene una precedencia mayor que el operador de asignación '='. Sin paréntesis, se evaluó como 'var list = (calls [ev] || calls [ev]) = {};' y daría como resultado un error. La [referencia de JavaScript de MDN] (https://developer.mozilla.org/en/JavaScript/Reference) es bastante completa. –

+0

posible duplicado de [¿Qué hace el || operador hacer?] (http://stackoverflow.com/questions/830618/what-does-the-operator-do) –

Respuesta

8

Este código es equivalente a

var list; 
if (calls[ev]) 
    list = calls[ev]; 
else { 
    calls[ev] = {}; 
    list = calls[ev]; 
} 

Dos características de la lengua se utilizan:.

  1. El acceso directo cálculo de expresiones booleanas (considere a || b Si a es true continuación b no es evaluado). Por lo tanto, si asigna var v = a || b; y a se evalúa como algo que se puede convertir a true, entonces b no se evalúa.
  2. La instrucción de asignación se evalúa como el último valor asignado (para permitir var a = b = c;)

Los paréntesis son necesarios para evitar esta interpretación:

var list = (calls[ev] || calls[ev]) = {}; 

(que es un error).

1

|| o 'lógica OR' tiene una mayor precedence que el operador de asignación =, así los paréntesis son necesarios para asegurar este idioma evalúa en el orden correcto

La otra cosa a tener en cuenta es que muchos idiomas, Javascript incluido, proporcione short-circuit evaluation de operadores booleanos como AND y OR. Si el primer operando de un lógico-o evalúa verdadero, no hay necesidad de evaluar el segundo operando, ya que no haría ninguna diferencia en el resultado.

Comprenda esto, y verá que esto no es una sintaxis de asignación especial, sino una expresión idiomática, o patrón, que explota una característica de idioma para proporcionar una representación más compacta de una idea.

+0

Enlace útil, gracias. – thugsb

5

Supongo que es correcto. Esta es una forma común de declarar valores "predeterminados" para variables en JavaScript.

function foo(bar) { 
    var bar = bar || 0; //This sets bar to 0 if it's not already set 
    console.log(bar); 
} 

La forma en que esto funciona es que en JavaScript, es una variable no definida Falsy, lo que significa que en cualquier operación booleana comparaison, se evaluará a false. A continuación, puede usar el operador OR para combinar dos valores y devolverá el primer valor que se evalúa como true.

+0

Gracias, llegué aquí buscando esa explicación. – NiloVelez

1

tienes razón en tu primera conjetura. Este es un patrón común para inicializar espacios de nombres de JavaScript. Sirve para asegurarse de no sobrescribir un objeto anterior con el mismo nombre. La mayoría de las bibliotecas populares harán algo similar para crear sus objetos de espacio de nombres.

El paréntesis está allí para que las expresiones se evalúen en el orden correcto.

Cuestiones relacionadas