2010-04-21 15 views
7

Debajo de las declaraciones de javascript se producirá un error, si ga no está declarado.¿Por qué la declaración de JavaScript "ga = ga || []" funciona?

if (ga) 
{ 
    alert(ga); 
} 

El error es:

ga is not defined 

Parece variable no declarada no puede ser reconocido en la expresión bool. Entonces, ¿por qué funciona la declaración a continuación?

var ga = ga || []; 

Para mí, el ga se trata como valor bool antes de "||". Si es falso, expresión después de "||" está asignado a ga final.

+0

Quizás quiso decir 'var ga = ga || [] 'porque' ga = ga || []; 'errores también (como señaló S.Mark). – R0MANARMY

+0

Gracias por señalar esto. He actualizado la pregunta. –

+3

Pensé que era ga = ga || oh.la = la; want (yourBadRomance); –

Respuesta

3

Editar: Primero tiene que usar var ga; o var ga = ga || [];, porque declara ga primero y le asigna valores.

Usted podría intentar esto

var x = 1, y = x + 1; 
alert([x,y]) // 1,2 

Usted puede notar, cuando y es declarar, x ya está declarada y ya le asigna 1 a la misma.

Por lo tanto, en su caso, cuando ga || [] asigna, ga ya está declarado y su variable válida.

+0

Vaya, me olvido de la "var". La pregunta está actualizada. –

+2

sí, porque cuando usa 'var' declara primero y la asignación ocurre más tarde. – YOU

+0

obteniendo 2 votos abajo ..., ¿alguien podría decir que mi respuesta es incorrecta? Entonces podría corregirlo. – YOU

4

nulo o definido son valores falsey en javascript (implícitamente se evalúa como falso) el || el operador devuelve el primer valor que no evalúa a falso.

var x = 0 || "" || null || "hello" || false; // x equals "hello" 

Por otra parte el operador & & devolverá el primer valor Falsey- o el último valor.

var y = "a string" && {"attr":"an object"} && false && ["array"]; 
// y equals false 

var z = "a string" && {"attr":"an object"} && ["array"]; 
// z equals ["array"] 
0

En el segundo enunciado ga se marca si está definido y si es verdadero, se asigna a sí mismo. De lo contrario, se le asigna un valor vacío.

1

Esto funciona en el caso con 'var' porque se crea la variable-stop en la resolución del alcance. Sin la 'var' que acaba de salir mirando a través de las cadenas de alcance y le dicen. Si realmente quiere de usar una variable global:

// This is fine because assignment always sets a property value 
// in this case (no 'var ga') it's the same as window.ga = window.ga || [] 
ga = window.ga || [] 

O:

// Once again, only the lookup is affected with "running off" 
// the lookup chain. It's not that the variable has no value -- 
// the problem is there IS NO VARIABLE. 
if (!window.ga) { 
    ga = [] 
} 

O incluso esto:

// First line is the same as window.ga = window.ga, 
// but now the property ga is guaranteed to exist on the window object -- 
// the VALUE of the property may (still) be undefined 
ga = window.ga 
ga = ga || [] 

Nótese que en ambos casos he invocado explícitamente ga como una propiedad del objeto window (global).

Puede leer sobre los detalles aquí: Identifier Resolution, Execution Contexts and Scope Chains.

colocación de var dentro de un alcance no importa.Todos los siguientes son los mismos:

var ga 
ga = ga || [] 

var ga = ga || [] 

ga = ga || [] 
var ga 
1

Posiblemente un menor de aspecto raro opción:

if (typeof ga !== 'undefined') 
{ 
    alert(ga); 
} 
0

Usted está esperando b para ser un array, probable que desee utilizar un método de matriz de b o lea un valor de índice del mismo.

var b= s.match(/\d+/) || []; 
return b[0]; 

devuelve el texto coincidente o undefined-

sin la matriz vacía assignmentment, la segunda línea sería un error si no había partido.

Cuestiones relacionadas