2013-03-20 11 views
5

Desidero creare un oggetto Javascript con variabili nidificate in cui alcune variabili non avranno un valore predefinito specificato.Dichiarazione di variabili senza valore

Al momento ho questo:

var globalVarA = "foo"; 
var globalVarB = "bar"; 
var globalVarC; 

function myFunction(){ 
    //do something 
} 

desidero cambiare questo:

var myObject = { 
    GlobalVars: { 
    globalVarA: "foo", 
    globalVarB: "bar", 
    globalVarC 
    }, 
    myFunction: function(){ 
    //do something 
    } 
} 

Tuttavia ottengo il seguente errore:

Expected ':'

Come posso dichiarare questa variabile senza un valore?

È la migliore prassi oppure esiste una soluzione alternativa migliore?

risposta

12

Se si desidera definire le variabili come proprietà di GlobalVars si deve assegnare esplicitamente undefined loro

GlobalVars: { 
    globalVarA: "foo", 
    globalVarB: "bar", 
    globalVarC: undefined 
    }, 

Il codice contiene la notazione non valido, quando si utilizza oggetto la notazione letterale è necessario specificare un valore per ogni variabile. Questo è diverso da altre notazioni come XML o formParams in cui è possibile dichiarare un attributo/proprietà senza impostarlo.

Si noti che nella mia soluzione le variabili non definite ottengono un valore predefinito - quel valore è solo il valore primitivo undefined che è quello che viene restituito di default per le variabili che non sono state definite.

Tuttavia, la variabile fa ottenere definito se si fa globalVarC: undefined

GlobalVars.globalVarC;//undefined 
GlobalVars.globalVarX;//undefined 
GlobalVars.hasOwnProperty("globalVarC");//true 
GlobalVars.hasOwnProperty("globalVarX");//false 

Dal spec:

4.3.9 undefined value:

primitive value used when a variable has not been assigned a value.

+0

Solo su una nota a margine. Quale sarebbe il lato negativo di non dichiarare 'globalVarC' affatto finché non è richiesto? Dato che puoi impostare 'GlobalVars.globalVarC =" qualunque cosa "; ' anche se non è dichiarato. –

+1

@TimBJames è un'ottima domanda. Ad esempio, la differenza potrebbe essere espressa in un controllo 'hasOwnProperty'. Personalmente, se è solo per uso in quella funzione, nel mio codice farei 'GlobalVars.globalVarC' invece di impostarlo esplicitamente su undefined. –

+0

Sì, probabilmente ci andrei anch'io, perché se si controlla l'esistenza della variabile, si dovrebbe controllare 'if (GlobalVars.globalVarC! = undefined) 'quale sarebbe il caso in entrambi i casi. –

1

è necessario specificare un valore per globalVarC altro la sintassi JavaScript per JSON è sbagliato, dal momento che non hai alcun valore da inizializzare, puoi dare il valore undefined.

undefined è una variabile globale con valore di origine non definito.

var myObject = { 
    GlobalVars: { 
    globalVarA: "foo", 
    globalVarB: "bar", 
    globalVarC: undefined 
    }, 
    myFunction: function(){ 
    //do something 
    } 
} 
0

Si vuole il undefined valore di base per essere il valore di default:

var myObject = { 
    GlobalVars: { 
    globalVarA: "foo", 
    globalVarB: "bar", 
    globalVarC: void 0 
    }, 
    myFunction: function(){ 
    //do something 
    } 
} 

Il void 0 espressione dà il valore di undefined, indipendentemente dal fatto che è stato undefined "reindirizzati".

+0

Mi chiedo solo ... Non invoca il compilatore JS sul valore 0? Non ho mai capito davvero perché avresti cambiato il valore di indefinito. Sulla stessa linea di pensiero, si potrebbe cambiare il valore di Function.prototype.call. Lo faresti nel codice di produzione te stesso? Quali vantaggi offre? Spero che questo non diventi aggressivo, sono davvero interessato al perché lo faresti. –

+0

@BenjaminGruenbaum Cosa intendi per "invocare il compilatore sul valore 0"? Per quanto riguarda la modifica di 'indefinito', sicuramente nessuno ha una buona ragione per farlo ;-) –

+0

l'operatore' void' richiama il compilatore JavaScript sulla seguente espressione (in questo caso '0' che viene lanciato su' "0" 'e restituisce 'undefined'). https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/void. Invocare il compilatore sembra un po 'estremo in questo caso imho. Anche 'globalVarC: (function() {var a; return a;})()' sembra più pulito. Farò un perf :) –

Problemi correlati