2013-06-14 16 views
5

Ich habe Javascript seit einiger Zeit programmiert und bin mir immer noch nicht ganz sicher, ob ich zu faul bin oder nicht. Ich habe eine Menge von:So stellen Sie sicher, dass eine Variable ein Objekt ist

if(typeof(something) === 'undefined'){ 
    // .. 
} 

Aber manchmal nur um es zu ausführlich wird. Zum Beispiel, jetzt mache ich:

var redirectURLs = hotplate.get('hotCoreAuth/redirectURLs/success') || {}; 

Das ist, weil in den folgenden Zeilen werde ich redirectURLs als Objekt zu behandeln, obwohl es überhaupt nicht definiert werden könnte (vielleicht die Funktion gut undefined zurück).

Gibt es einen "Best Practice" Cheatsheet? Ist das, was ich oben geschrieben habe einfach zu faul? Es ist nur so, dass die Alternative umständlich ist:

var redirectURLs = hotplate.get('hotCoreAuth/redirectURLs/success'); 
if(typeof(redirectURLs) === 'undefined'){ 
    redirectURLs = {} 
} 

Ich stelle fest, dass die Verknüpfung weniger robust ist, aber dann wieder, werden die Menschen entweder diesen Wert gesetzt ist, oder nicht.

Ideen?

Merc.

+1

Ich neige dazu, einen 'NS.isDefined hinzufügen (test_var, [default_if_not_defined])' Hilfsfunktion –

Antwort

0

Wenn Sie Ihre "Abkürzung" verwenden, ist, dass entspricht dem folgenden:

var redirectURLs = hotplate.get('hotCoreAuth/redirectURLs/success'); 
if (!redirectURLs) redirectURLs = {}; 

Die Spezifikation (ECMA-262) besagt, dass die logischen OR-Operator (||) prüft, ob die Der erste Ausdruck (in diesem Fall der Funktionsaufruf) wird auf "Wahr" gesetzt oder nicht - wenn er auf "Wahr" gesetzt wird, wird der erste Ausdruck zurückgegeben, andernfalls den zweiten Ausdruck zurückgeben.

Darin heißt es auch, was wahr und falsch nötigt (§9.2 - beachten Sie, dass dies nicht wörtlich angegeben):

False:

  • Die Zahlen +0, -0, und NaN
  • die leere Zeichenkette ("")
  • false
  • null
  • undefined

True: alles andere (einschließlich Sachen wie new Boolean(false))

Also, wenn Sie nichts dagegen haben die meisten Zahlen, Strings oder der Wert true durch Vermietung, dann wäre die logische OR "Abkürzung" OK. Beachten Sie, dass Ihr „ausführlicher“ Code brechen könnte, wenn redirectURLs ist null:

var redirectURLs = null; 
if (typeof redirectURLs === 'undefined') { 
    redirectURLs = {}; 
} 
redirectURLs.test = '1'; // TypeError: Cannot set property 'test' of null 
0

Wenn Sie immer mit Objekten aus einer externen API umgehen wollen (ich nehme an, Sie haben keine Kontrolle über die -Bibliothek), könnten Sie jeden Funktionsaufruf umwandeln, um ein Objekt zu werfen.

function getHotplateUri(uri){ 
    // Probably good to validate the URI format 
    var redirectURLs = hotplate.get(uri); 
    if(typeof(redirectURLs) === 'undefined'){ 
     redirectURLs = {} 
    } 
    return redirectURLs 
} 
+0

Der Wrapper Vorschlag ist in Ordnung, aber anders als die Ich stimme überhaupt nicht mit diesem Code überein, es ist sehr stinkend. Warum würden Sie vorschlagen, die "uri" zu validieren? Warum ist 'hotplate' keine Abhängigkeit? – Halcyon

+0

Warum validieren Sie den URI: für alle Verbraucher des Wrappers schnell ausfallen. Warum ist die heiße Platte keine Abhängigkeit: einverstanden, sollte dies der Fall sein. – Sparko

0

Mit typeof, die einen Operator ist (nicht nötig Klammern) Sie überprüfen, für Existenz der Variablen. Der Kurzschlussoperator || geht davon aus, dass die Variable bereits existiert (wurde deklariert) und prüft, ob ihr Wert falsy ist (undefined, null, leerer String, null ...).

In diesem Fall ist die Verwendung von typeof redundant, weil Sie den zurückgegebenen Wert einer Methode des Objekts hotplate testen, die bereits vorhanden ist. Wie Sie gesagt haben:

... könnte die Funktion gut zurückkehren undefined

"undefined" ein Typ ist, während undefined ein vordefinierter Wert (vom Typ "undefined") ist. Es wird Variablen zugewiesen, wenn sie hochgezogen werden, bis die Zuweisung erfolgt. Wenn es keine Zuweisung gibt, wird die Variable deklariert, hat aber einen Wert von undefined. Auch Funktionen, die nichts zurückgeben, geben undefined zurück.

So typeof undefined === 'undefined' // true

+0

Also der Shortcut-Code ist eigentlich 100% OK ... – Merc

+0

In deinem Fall würde ich ja sagen. – elclanrs

+0

Gibt es ein schönes, "akzeptiertes" Dokument, das erklärt, wann es ok ist, die Abkürzung zu benutzen, warum, etc.? – Merc

Verwandte Themen