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
.
fonte
2013-06-27 16:50:29
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
@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
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