2009-04-02 7 views
42

Ich fühle mich wie ich versuche, etwas sehr einfach zu tun, aber nur dumm darüber zu sein.javascript: Definieren Sie eine Variable, wenn sie nicht existiert

alles, was ich tun möchte, ist zu sehen, ob eine Variable zuvor festgelegt wurde, und wenn dies nicht der Fall, stellen Sie ihn mit einem Standardwert .... hier ist ein Beispiel:

if(!embed_BackgroundColor) { 
    var embed_BackgroundColor; 
    embed_BackgroundColor = "#F4F4F4"; 
} 

so, einmal Du hörst auf, über meinen Code zu lachen .... WARUM überschreibt er die Variable, egal was?

bitte meine Nerven sparen;)

Antwort

52
if (typeof variable === 'undefined') { 
    // variable is undefined 
    // eg: 
    // var variable = "someValue"; 
} 
+0

das Problem ist, dass egal, was die // var Variable = „somevalue“ ist die vordefinierten Wert zu überschreiben, die – johnnietheblack

+0

DID gibt, die wirklich drei = s ist? (Ich weiß es nicht) – jedierikb

+3

Ich bin mir nicht sicher, warum das akzeptiert wird. Es scheint, den obigen Code zu verwenden (mit der 'var Variable =" someValue ";' Zeile unkommentierte Ergebnisse in 'Variable' ist immer gleich" someValue ", selbst wenn es bereits definiert wurde. –

0

Ich denke, Ihr geschrieben Code funktionieren sollte. Es sei denn, Ihr ursprünglicher Wert ist 0.

Das Problem ist woanders.

Ich vermute, dass Sie 'embed_BackgroundColor' außerhalb des Bereichs Ihres Codes definiert haben. Und wenn Sie Ihren Code ausführen, ist diese Variable im Bereich des Codes nicht definiert und erhält den Standardwert. Hier

ein Beispiel:

var embed_BackgroundColor = "#FF0000"; 

(function(){ 
    if(!embed_BackgroundColor) { 
    var embed_BackgroundColor; 
    embed_BackgroundColor = "#F4F4F4"; 
    } 
    alert(embed_BackgroundColor); // will give you #F4F4F4 
})(); 

alert(embed_BackgroundColor); // will give you #FF0000; 
0

Ich ziehe es eine allgemeine Lösung in PHP-Stil:

function isset(x) { return typeof(x)!='undefined'; }

+0

das wird nicht funktionieren. Es wird Ihnen einen Referenzfehler geben: [x] ist nicht definiert. – KooiInc

+0

Es funktioniert, aber Sie müssen daran denken, dass isset (obj.arr [x]) nicht funktioniert Wenn Sie nicht erst nach isset (obj) und dann nach isset (obj.arr) suchen – Thinker

42

Es wäre eine gute Codierung der Praxis in diesem Fall die ternären zu verwenden Operator. Außerdem müssen Sie beim Vergleich mit typeof nicht drei gleiche Vorzeichen haben. Dies ist die beste Lösung:

b = typeof(b) == 'undefined' ? 0 : b; 

Dies wird hoffentlich Ihre Hände einige Zeit sparen.

+1

Ähnlich wie bei der Antwort auf 'calmbird's Antwort (unten ... vielleicht), sieht es so aus, als ob b sich selbst neu zugewiesen wird wenn es definiert ist, scheint es, als könnte es in einer Schleife schlecht-isch (nicht schrecklich) sein Ich weiß nicht, wie der Dolmetscher genau damit umgehen wird, aber es sieht so aus, als wäre es eine unnötige Neuzuweisung. – dylnmc

+5

Ich denke, muss '===' anstelle von '==' –

+0

Dies sollte die akzeptierte Antwort sein, wird die Antwort mit der größten Anzahl von Stimmen nicht immer funktionieren –

1

Wenn embed_BackgroundColor ein Parameter in einer Funktion, die nicht übergeben bekommen haben, können Sie eine Standard mit

embed_BackgroundColor ? embedBackgroundColor : embed_BackgroundColor = "#F4F4F4"; 

Voller Funktion Vorbild

function colorFunctionThing(embed_BackgroundColor) { 
    embed_BackgroundColor ? embed_BackgroundColor : embed_BackgroundColor = "#F4F4F4"; 
    console.log(embed_BackgroundColor); 
}; 
colorFunctionThing(); 

Ausgänge

#F4F4F4 

Nicht genau das, wonach du gesucht hast, aber immer noch wirklich gut zu wissen.

25

Um tatsächlich Ihre Frage zu beantworten, warum das passiert - es ist nur ein wenig über zwei Jahre und einen Monat: D -, ist es wegen variable hoisting.

Grundsätzlich gibt es eine Phase vor dem Code im globalen Bereich der Ausführung oder in einer Funktion, wo der Code für alle var und function Erklärungen gescannt wird (nicht mit Funktion zu verwechseln Ausdrücke, aber das ist eine andere Geschichte).
Alle diese Variablen und Funktionen werden dann innerhalb des aktuellen Bereichs deklariert, und nur danach wird der Code tatsächlich ausgeführt.

Dies geschieht unabhängig von ihrer Position im Code mit Bereichen, die Funktionskörpern entsprechen, nicht Blöcken von Anweisungen. Und was dies noch kontraintuitiver macht, auch wenn Sie den Variablen in ihren Deklarationen einen Anfangswert zuweisen, they will still remain "empty" until the declaration is reached again in normal execution flow. So

, wenn Sie schreiben:

if(!embed_BackgroundColor) { 
    var embed_BackgroundColor; 
    embed_BackgroundColor = "#F4F4F4"; 
} 

was tatsächlich passiert, ist dies:

  1. -Code wird für var Erklärungen gescannt. embed_BackgroundColor wird in diesem Bereich deklariert, unabhängig davon, ob es bereits deklariert wurde oder nicht. Sein Anfangswert ist nicht definiert.

  2. Die Ausführung des Codes beginnt. Die if-Anweisung wird ausgeführt. Die Variable ist deklariert, aber ihr Wert ist nicht definiert, daher ist die Bedingung wahr. Die Verwendung von typeof würde nicht helfen, hier zwischen einer nicht deklarierten und einer deklarierten aber noch nicht gesetzten Variablen zu unterscheiden. Es macht sowieso keinen Unterschied.

  3. Die Deklaration var wird durch normalen Code-Fluss erreicht. Wenn Sie der Variablen einen Anfangswert gegeben hätten, wäre dieser jetzt gesetzt worden. In diesem Fall passiert nichts.

  4. embed_BackgroundColor wird auf den Wert "#F4F4F4" gesetzt.

also bottom-line ist: Sie typeof variable == 'undefined' in den anderen Antworten, wie gesehen verwenden können, oder auch schlicht als Sie ursprünglich verwendet haben, aber nicht verwenden var oder das wird alles ruinieren ‚Variable‘.

+0

Ist es wirklich deklariert, wird aber als "undefiniert" bewertet? Ich dachte, der ganze Zweck von undefiniert wäre für Dinge, die nicht deklariert sind! (dh nicht definiert). Meinst du null? – Moss

+0

@Moss Nein, es ist wirklich undefined. Dies ist der Standardwert für nicht initialisierte Variablen in JS (mit nicht initialisiert bedeutet ich "ohne einen ihnen zugewiesenen Wert"). Probieren Sie es einfach auf Firebug oder was auch immer: 'typeof blah' bewertet die Zeichenkette' 'undefined''. – Zecc

+2

Jemand bitte ändern Sie dies in die richtige Antwort ... – Merc

10

Ich ziehe diese Syntax:

embed_BackgroundColor = embed_BackgroundColor || "#F4F4F4"

nicht viel mehr kann als einfach erhalten! Und es scheint zu funktionieren, auch wenn es var'd wurde.

+5

'' 'ReferenceError: embed_BackgroundColor ist nicht definiert''' müssen definieren' '' var embed_BackgroundColor '' 'erste –

1

Ich folge Chris West's Blog und sah, dass er einen ziemlich coolen Weg bei http://gotochriswest.com/blog/2012/07/02/javascript-define-if-undefined/ gepostet hat.

Grundsätzlich haben Sie die Definition für die define Funktion und verwenden Sie es dann wie folgt aus:

define("embed_BackgroundColor", "#F4F4F4"); 

Der obige Code enbed_BackgroundColor im globalen Kontext definieren, wenn es nicht bereits definiert ist. Das Beispiel, dass Chris verwendet wird, ist ein bisschen mehr nützlich und ist wie folgt: „jStuff nicht definiert ist“

alert("jStuff is " + (typeof jStuff == "undefined" ? "un" : "") + "defined."); 

define("jStuff.alert", function(msg) { 
    alert(msg); 
    return msg; 
}); 

alert("jStuff is " + (typeof jStuff == "undefined" ? "un" : "") + "defined."); 

var str = jStuff.alert("Show and save this message."); 
  • Die erste Alarm-Anweisung wird angezeigt,
  • Die zweite Warnmeldung wird angezeigt, "jStuff ist definiert."
  • Die letzte Alert-Anweisung zeigt die angegebene Warnung an und diese Zeichenfolge wird dann in der Variablen str gespeichert.
66

Pro-Stil:

var SomeVar = SomeVar || 'Default Value'; 
+1

: \ SineVar' zu sich selbst nicht neu zuweisen? In der Tat sieht es wie ein "Pro" -Stil aus, aber es scheint in der Tat etwas unoptimiert zu sein (insbesondere für eine For/While-Schleife). Ich würde einfach bei einem wenn bleiben. Ich könnte jedoch falsch liegen und der Interpreter könnte erkennen, dass er keine 'var' in * sich selbst speichern muss *. – dylnmc

+2

Dies ist die "richtige" Antwort imho. – codebreaker

+7

Ein Wort der Warnung: Wenn 'SomeVar' ein false-y-Wert sein kann, wird dies fehlschlagen. Dinge wie '' '', 'false' und' 0' lösen das '||' aus und setzen den Standardwert Wenn Sie wollen, dass 'SomeVar' 'false-y' Werte sein können, dann verwenden Sie a ternär, wie in @Jhuni Antwort (aber mit dem var Schlüsselwort wie in diesem). Stimmen Sie auch mit @dylnmc überein, dies führt zu einer unangemessenen Neuzuweisung. @Paolo Berantino hat, was ich fühle, ist die "richtige" Antwort. Ich persönlich stimme absolut nicht zu, dass "klein und kompakt" in der Regel "Pro Style" ist. Wir verwenden keine Lochkarten mehr und js Minifier gleichen den Rest aus. – Fodagus

9

Wenn es eine globale Variable, ich mag tun:

var defineMe = window.defineMe || 'I will define you now'; 

Es ist wichtig, das Fenster Namensraum zu verwenden, da nicht definierte Variablen referenziert wird sehr schlecht zu Fehlern führen, Verweisen auf undefinierte Eigenschaften werden jedoch nicht.

0

Da Ihr if Block wird ausgeführt, wenn embed_BackgroundColorfalse ist, 0, "", null, undefined oder NaN.

Aber embed_BackgroundColor sollte nicht überschrieben werden, wenn es bereits einer anderen nicht leere Zeichenfolge zugewiesen wurde ... Oder zumindest, es geht nicht an meinem Ende.

Vielleicht ist es ein Fall von widersprüchlichen Bereichen, wie Aaron Qian darauf hingewiesen hat.

0

Beste Option:

if (typeof someVar === 'undefined') someVar = someValue; 
Verwandte Themen