2013-06-27 7 views
8

Coffee dreht user?.id inWie erstellt man einen CoffeeScript-Stil existentiellen Operator in JavaScript?

if (typeof user !== "undefined" && user !== null) { 
    user.id; 
} 

Ist es möglich, eine JavaScript-Funktion exists zu erstellen, die ähnlich etwas tun würden? das heißt

exists(user).id 

würde entweder user.id oder null

Es wäre einfacher, wenn eine Funktion eines anderen Parameter akzeptiert, das heißt exists(user, 'id'), aber das wäre nicht so schön aussehen.

+0

für diesen einen Mehrzweck-Getter benötigen würde ('definegetter (o, Funktion (Eigentum) {...})', die sind, wenn ich Correclty erinnern, das nicht Teil der Spezifikation von JavaScript. – Zeta

+0

@Zeta Nicht in der Tat, da der Zugriff auf eine nicht existierende Eigenschaft eines Objekts 'undefined' zurückgibt, anstatt zu versagen, was gut genug sein sollte. – millimoose

+3

Der nächste, den ich mir vorstellen kann, ist 'function exists (obj) {if (obj) return obj; return {}; } ', aber das wird nicht mit undefinierten Variablen umgehen Javascript ist nicht syntaktisch so erweiterbar – millimoose

Antwort

5

Nein, Sie können eine solche Funktion nicht erzeugen. Das Problem ist, dass dies:

any_function(undeclared_variable) 

eine Reference produzieren, wenn undeclared_variable nirgendwo erklärt wurde. Zum Beispiel, wenn Sie diesen Stand-alone-Code ausführen:

function f() { } 
f(pancakes); 

es eine Reference bekommen, weil pancakes nirgendwo erklärt wurde. Demo: http://jsfiddle.net/ambiguous/wSZaL/

Allerdings kann die typeof operator auf etwas verwendet werden, die dies so nicht deklariert wurde:

console.log(typeof pancakes); 

wird einfach eine undefined in der Konsole anmelden. Demo: http://jsfiddle.net/ambiguous/et2Nv/

Wenn Sie nicht möglich ReferenceErrors nichts dagegen haben, dann haben Sie bereits die notwendige Funktion in Ihrer Frage:

function exists(obj, key) { 
    if (typeof obj !== "undefined" && obj !== null) 
     return obj[key]; 
    return null; // Maybe you'd want undefined instead 
} 

oder, da Sie müssen typeof auf nicht deklarierte Variablen nicht in der Lage zu verwenden, hier können Sie es vereinfachen bis:

function exists(obj, key) { 
    if(obj != null) 
     return obj[key]; 
    return null; 
} 

Beachten Sie die Änderung != ist undefined == null gilt, obwohl undefined === null nicht.

3

Sehr alte Frage aber brachte mich dazu, über diese Lösung nachzudenken.

exists = (obj) => obj || {} 
exists(nullableObject).propName; 
Verwandte Themen