2013-03-20 14 views
5

Ich möchte ein Javascript-Objekt mit verschachtelten Variablen erstellen, für die einige der Variablen keinen Standardwert haben.Deklarieren von Variablen ohne Wert

Im Moment habe ich dies:

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

function myFunction(){ 
    //do something 
} 

Ich möchte, dies ändern:

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

Jedoch habe ich die folgende Fehlermeldung erhalten:

Expected ':'

Wie kann ich diese Variable deklarieren ohne einen Wert?

Ist dies die beste Vorgehensweise oder gibt es eine bessere Alternative?

Antwort

12

Wenn Sie die Variablen als Eigenschaften von GlobalVars definieren wollen, müssen Sie explizit undefined ihnen

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

Ihr Code enthalten ungültige Schreibweise zuweisen, wenn Objektliteral Notation Sie einen Wert für jede Variable angeben müssen. Im Gegensatz zu anderen Notationen wie XML oder formParams können Sie ein Attribut/eine Eigenschaft deklarieren, ohne es zu setzen.

Beachten Sie, dass in meiner Lösung undefinierte Variablen einen Standardwert erhalten - dieser Wert ist nur der Grundwert undefined, der standardmäßig für nicht definierte Variablen zurückgegeben wird.

jedoch Ihre Variable tut definiert zu erhalten, wenn Sie globalVarC: undefined tun

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

Vom spec:

4.3.9 undefined value:

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

+0

Nur eine Randnotiz. Was wäre der Nachteil, überhaupt nicht "globalVarC" zu deklarieren, bis es benötigt wird? Da können Sie 'GlobalVars.globalVarC =" was auch immer "; ' auch wenn es nicht erklärt wird. –

+1

@TimBJames das ist eine ausgezeichnete Frage. Zum Beispiel könnte der Unterschied in einer 'hasOwnProperty'-Prüfung ausgedrückt werden. Persönlich, wenn es nur für diese Funktion verwendet wird, würde ich in meinem eigenen Code "GlobalVars.globalVarC" verwenden, anstatt es explizit auf undefined zu setzen. –

+0

Ja, ich würde wahrscheinlich auch mitgehen, denn wenn Sie nach der Existenz der Variablen suchen, würden Sie 'if (GlobalVars.globalVarC! = undefined) 'was in beiden Fällen der Fall wäre. –

1

Sie benötigen einen Wert für globalVarC sonst die JavaScript-Syntax für json angeben werden Falsch sein, da Sie keinen Wert zur Initialisierung haben, können Sie den Wert undefined angeben.

undefined ist eine globale Variable mit primitivem Wert undefined.

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

Sie wollen die undefined Grundwert der Standardwert sein:

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

Der void 0 Ausdruck gibt den Wert von undefined, unabhängig davon, ob undefined wurde „umgeleitet“.

+0

Nur wundernd .. Ruft das nicht den JS-Compiler auf den Wert 0? Ich habe nie wirklich verstanden warum du den Wert von undefined änderst. Auf demselben Gedankengang könnte man den Wert von Function.prototype.call ändern. Würden Sie das im Produktionscode selbst tun? Welche Vorteile bietet es? Ich hoffe, das geht nicht so aggressiv, ich bin wirklich interessiert, warum du das machst. –

+0

@BenjaminGruenbaum Was meinen Sie mit "den Compiler auf Wert 0 aufrufen"? Was das Ändern von "undefined" betrifft, hat sicherlich niemand einen Grund, das zu tun ;-) –

+0

Der Operator 'void' ruft den JavaScript-Compiler für den folgenden Ausdruck auf (in diesem Fall' 0', der in '" 0 "und umgewandelt wird) gibt 'undefined' zurück. https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/void. Das Aufrufen des Compilers scheint in diesem Fall ein bisschen extrem zu sein. Sogar 'globalVarC: (function() {var a; return a;})()' scheint sauberer zu sein. Ich mache eine Perf :) –

Verwandte Themen