2012-03-06 17 views
8

favore qualcuno può spiegarmi cosa questa riga di codice fa:JavaScript fallback variabile

var list = calls[ev] || (calls[ev] = {}); 

La mia ipotesi migliore:

E 'l'impostazione della "lista" variabile con il valore di calls.xxx, dove xxx è una variabile, ev. Se le chiamate [ev] non esistono, allora la sta creando come un oggetto vuoto e assegnando tale oggetto vuoto a "lista". È giusto?

Perché viene utilizzata la parentesi? Dove posso trovare maggiori informazioni sull'uso di || quando si impostano le variabili e l'uso delle parentesi in questo contesto? Grazie!

+0

La parentesi sta solo garantendo la giusta valutazione dell'espressione, perché '||' ha una precedenza più alta rispetto all'operatore di assegnazione '='. Senza parentesi, è stato valutato come 'var list = (chiama [ev] || chiama [ev]) = {};' e genera un errore. Il [riferimento JavaScript MDN] (https://developer.mozilla.org/en/JavaScript/Reference) è piuttosto completo. –

+0

possibile duplicato di [Cosa fa il || operatore?] (http://stackoverflow.com/questions/830618/what-does-the-operator-do) –

risposta

8

Questo codice è equivalente al

var list; 
if (calls[ev]) 
    list = calls[ev]; 
else { 
    calls[ev] = {}; 
    list = calls[ev]; 
} 

Due caratteristiche del linguaggio vengono utilizzati:.

  1. Il scorciatoia calcolo di espressioni booleane (si pensi a || b Se a è true poi b non è valutato). Pertanto, se assegni var v = a || b; e a valutazioni a qualcosa che può essere trasmesso a true, allora b non viene valutato.
  2. L'istruzione di assegnazione viene valutato come l'ultimo valore assegnato (per consentire var a = b = c;)

Le parentesi sono necessarie per evitare questa interpretazione:

var list = (calls[ev] || calls[ev]) = {}; 

(che è un errore).

1

|| o 'OR logico' ha una maggiore precedence che l'operatore di assegnazione =, quindi sono necessarie le parentesi per garantire questo idioma valuta nel giusto ordine

L'altra cosa da considerare è che molte lingue, Javascript incluso, fornire short-circuit evaluation di operatori booleani come AND e OR. Se il primo operando di una logica o valuta true, non è necessario valutare il secondo operando, poiché non farebbe alcuna differenza nel risultato.

Capire questo, e vedrete che questa non è una sintassi di assegnazione speciale, ma un idioma, o schema, che sfrutta una caratteristica del linguaggio per fornire una rappresentazione più compatta di un'idea.

+0

Link utile, grazie. – thugsb

5

La tua ipotesi è giusta. Questo è un modo comune per dichiarare valori "predefiniti" per le variabili in JavaScript.

function foo(bar) { 
    var bar = bar || 0; //This sets bar to 0 if it's not already set 
    console.log(bar); 
} 

Il modo in cui funziona è che in JavaScript, una variabile non definita è falsy, il che significa che in ogni operazione booleana comparaison, si valuterà a false. È quindi possibile utilizzare l'operatore OR per combinare due valori e restituirà il primo valore che valuta a true.

+0

Grazie, sono arrivato qui cercando quella spiegazione. – NiloVelez

1

hai ragione sulla tua prima ipotesi. Questo è un modello comune per l'inizializzazione degli spazi dei nomi javascript. Serve per assicurarti di non sovrascrivere un oggetto precedente con lo stesso nome. Le librerie più popolari faranno qualcosa di simile per creare i loro oggetti namespace.

La parentesi è lì in modo che le espressioni vengano valutate nell'ordine corretto.