2013-03-20 11 views
5

Chcę utworzyć obiekt JavaScript ze zmiennymi zagnieżdżonymi, w których niektóre zmienne nie będą miały wartości domyślnej.Deklarowanie zmiennych bez wartości

Obecnie mam to:

var globalVarA = "foo"; 
var globalVarB = "bar"; 
var globalVarC; 

function myFunction(){ 
    //do something 
} 

Chciałbym to zmienić na:

var myObject = { 
    GlobalVars: { 
    globalVarA: "foo", 
    globalVarB: "bar", 
    globalVarC 
    }, 
    myFunction: function(){ 
    //do something 
    } 
} 

Jednak pojawia się następujący błąd:

Expected ':'

Jak mogę zadeklarować tę zmienną bez wartości?

Czy jest to najlepsza praktyka lub czy istnieje alternatywne lepsze rozwiązanie?

Odpowiedz

12

Jeśli chcesz zdefiniować zmienne jako właściwości GlobalVars trzeba jednoznacznie przypisać undefined im

GlobalVars: { 
    globalVarA: "foo", 
    globalVarB: "bar", 
    globalVarC: undefined 
    }, 

Kod zawierał nieprawidłowy zapis, przy użyciu obiektu dosłownego zapisu należy określić wartość dla każdej zmiennej. W przeciwieństwie do innych notacji, takich jak XML lub formParams, można zadeklarować atrybut/właściwość bez ustawiania go.

Należy zauważyć, że w moim rozwiązaniu niezdefiniowane zmienne uzyskują wartość domyślną - ta wartość jest tylko prymitywną wartością undefined, która jest zwracana domyślnie dla zmiennych, które nie zostały zdefiniowane.

jednak zmienna robi się zdefiniowane jeśli nie globalVarC: undefined

GlobalVars.globalVarC;//undefined 
GlobalVars.globalVarX;//undefined 
GlobalVars.hasOwnProperty("globalVarC");//true 
GlobalVars.hasOwnProperty("globalVarX");//false 

Z spec:

4.3.9 undefined value:

primitive value used when a variable has not been assigned a value.

+0

Tylko na marginesie. Co byłoby wadą, aby nie ogłaszać "globalVarC" w ogóle, dopóki nie jest wymagane? Ponieważ możesz ustawić "GlobalVars.globalVarC =" cokolwiek ";" nawet jeśli nie jest zadeklarowany. –

+1

@TimBJames to doskonałe pytanie. Na przykład różnica może być wyrażona w sprawdzeniu 'hasOwnProperty'. Osobiście, jeśli jest to tylko do użytku w tej funkcji, w moim własnym kodzie zrobiłbym 'GlobalVars.globalVarC' zamiast jawnie ustawiając go na undefined. –

+0

Tak, pewnie też bym chodził, ponieważ jeśli sprawdzasz istnienie zmiennej, sprawdziłbyś 'if (GlobalVars.globalVarC! = undefined) "co miałoby miejsce w obu przypadkach. –

1

musisz określić wartość dla globalVarC innego javascript składni dla json będzie myl się, ponieważ nie masz żadnej wartości do zainicjowania, możesz podać wartość undefined.

undefined jest zmienna globalna o wartości pierwotnej niezdefiniowany.

var myObject = { 
    GlobalVars: { 
    globalVarA: "foo", 
    globalVarB: "bar", 
    globalVarC: undefined 
    }, 
    myFunction: function(){ 
    //do something 
    } 
} 
0

Będziemy chcieli wartość prymitywny undefined być wartość domyślna:

var myObject = { 
    GlobalVars: { 
    globalVarA: "foo", 
    globalVarB: "bar", 
    globalVarC: void 0 
    }, 
    myFunction: function(){ 
    //do something 
    } 
} 

Wyrażenie void 0 daje wartość undefined, niezależnie od tego, czy undefined została „przekierowane”.

+0

Po prostu zastanawiam się. Czy to nie wywołuje kompilatora JS na wartości 0? Nigdy tak naprawdę nie rozumiem, dlaczego miałbyś zmienić wartość niezdefiniowaną. Na tym samym toku myślenia można zmienić wartość Function.prototype.call. Czy zrobiłbyś to sam w kodzie produkcyjnym? Jakie ma zalety? Mam nadzieję, że to nie będzie tak agresywne, naprawdę jestem zainteresowany tym, dlaczego to zrobiłeś. –

+0

@BenjaminGruenbaum Co rozumiesz przez "wywołanie kompilatora na wartość 0"? Jeśli chodzi o zmianę 'undefined', z pewnością nikt nie ma ku temu żadnego powodu ;-) –

+0

Operator' void' wywołuje kompilator JavaScriptu w następującym wyrażeniu (w tym przypadku '0' który jest rzutowany na' "0" 'i zwraca 'undefined'). https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/void. Wywołanie kompilatora wydaje się nieco ekstremalne w tym przypadku imho. Nawet 'globalVarC: (function() {var a; return a;})()' wydaje się być czystszy. Zrobię perfekcję :) –

Powiązane problemy