2013-06-27 12 views
8

CoffeeScript si trasforma in user?.idCome creare un operatore esistenziale in stile CoffeeScript in JavaScript?

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

E 'possibile creare una funzione JavaScript exists che avrebbe fatto qualcosa di simile? vale a dire

exists(user).id 

si tradurrebbe in uno user.id o null

Sarebbe più facile se una funzione accetta un altro parametro, cioè exists(user, 'id'), ma che non sembrerebbe così bello.

+0

Per questo avrebbe bisogno di getter uso generale ('definegetter (o, la funzione (di proprietà) {...})', che sono, se ricordo correclty, non fa parte della specifica di JavaScript. – Zeta

+0

@Zeta Non in realtà, dal momento che l'accesso a una proprietà inesistente di un oggetto restituisce 'undefined' invece di fallire, che dovrebbe essere abbastanza buono – millimoose

+3

La cosa più vicina a cui posso pensare è' function exists (obj) {if (obj) return obj; return {}; } ', ma che non gestirà le variabili non definite.Javascript non è sintatticamente estendibile in questo modo. – millimoose

risposta

5

No, non è possibile produrre tale funzione. Il problema è che questo:

any_function(undeclared_variable) 

produrrà un ReferenceError se undeclared_variable non è stato dichiarato da nessuna parte. Ad esempio, se si esegue questa posizione di codice da soli:

function f() { } 
f(pancakes); 

si otterrà un ReferenceError perché pancakes non è stato dichiarato da nessuna parte. Demo: http://jsfiddle.net/ambiguous/wSZaL/

Tuttavia, il typeof operator può essere utilizzato su qualcosa che non è stato dichiarato quindi questo:

console.log(typeof pancakes); 

sarà semplicemente registrare un undefined nella console. Demo: http://jsfiddle.net/ambiguous/et2Nv/

Se non ti dispiace possibili ReferenceErrors allora hai già la funzione necessaria nella tua domanda:

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

o, dal momento che non c'è bisogno di essere in grado di utilizzare typeof su variabili non dichiarate qui, è possibile semplificare il basso per:

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

nota la modifica !=, undefined == null è vero anche se non è undefined === null.

3

Domanda molto vecchia ma mi ha fatto pensare a questa soluzione.

exists = (obj) => obj || {} 
exists(nullableObject).propName; 
Problemi correlati