2010-04-21 16 views
7

Poniższe instrukcje javascript będą powodować błąd, jeśli nie zostanie zadeklarowany ga.Dlaczego JavaScript Statement "ga = ga || []" Działa?

if (ga) 
{ 
    alert(ga); 
} 

Błąd jest:

ga is not defined 

Wygląda zmienna nierejestrowana nie może być ujęta w wyrażeniu bool. Dlaczego poniżej działa instrukcja poniżej?

var ga = ga || []; 

Dla mnie, ga jest traktowany jak wartość bool przed "||". Jeśli jest to fałsz, wyrażenie po "||" jest przypisany do końcowego ga.

+0

Czy chodziło o 'var ga = ga || [] 'ponieważ' ga = ga || []; 'również błędy (jak zauważył S.Mark). – R0MANARMY

+0

Dzięki za wskazanie tego. Zaktualizowałem to pytanie. –

+3

Myślałem, że to był ga = ga || oh.la = la; want (yourBadRomance); –

Odpowiedz

3

Edit: Trzeba użyć var ga; pierwszy lub var ga = ga || [];, ponieważ jego stwierdzenie ga pierwszy i przypisanie wartości do niego.

można spróbować to

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

Można zauważyć, gdy y jest zadeklarować, x jest już ogłoszony i już przypisana 1 do niej.

Tak więc, w twoim przypadku, gdy przydziela, ga jest już zadeklarowane i jest jego prawidłową zmienną.

+0

Ups, zapominam o "var". Pytanie jest aktualizowane. –

+2

tak, ponieważ, gdy użyjesz 'var' jego deklaracja pierwsza i zadanie stanie się później. – YOU

+0

otrzymujesz 2 downvotes ..., więc czy ktoś mógłby wskazać, że moja odpowiedź jest błędna? Mógłbym to poprawić. – YOU

4

null lub zdefiniowane są wartości falsey w javascript (domyślnie oznacza fałsz). || operator zwraca pierwszą wartość, która nie jest równa false.

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

Z drugiej strony operator & & zwróci pierwszą wartość falsey lub ostatnią wartość.

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

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

W drugiej instrukcji ga jest sprawdzane, jeśli jest zdefiniowane, a jeśli jest prawdziwe, jest przypisane do siebie. W przeciwnym razie jest przypisana pusta wartość.

1

Działa to w przypadku z "var", ponieważ tworzony jest zmienny-stop w rozdzielczości zakresu. Bez "var" po prostu uciekniesz, przeglądając łańcuchy zasięgu i otrzymasz informację. Jeśli naprawdę chcą użyć zmiennej globalnej:

// 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 || [] 

czyli

// 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 = [] 
} 

Albo jeszcze tak:

// 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 || [] 

zauważyć, że w obu tych przypadkach jawnie wywołana ga jako właściwość obiektu (globalnego) window.

Możesz przeczytać o szczegółach tutaj: Identifier Resolution, Execution Contexts and Scope Chains.

Umieszczenievar w zakresie nie ma znaczenia.Wszystkie z poniższych są takie same:

var ga 
ga = ga || [] 

var ga = ga || [] 

ga = ga || [] 
var ga 
1

Możliwie mniej dziwnie wyglądających opcja:

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

Państwo oczekują b, aby być tablicą, prawdopodobnie chcesz użyć metody tablicy na b lub odczytaj z niej wartość indeksu.

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

ten zwraca dopasowanego tekstu lub undefined-

bez pustej tablicy assignmentment, druga linia rzucał błąd, jeśli nie było żadnego meczu.

Powiązane problemy