2010-07-09 8 views
7

Mi sono imbattuto in due modi diversi per definire/nominare oggetti e funzioni in JavaScript che prima controllano l'esistenza del nome prima di usarlo. Il problema è che non so quale sia il migliore (dal punto di vista della velocità e dell'usabilità) ed è impossibile utilizzare gli operatori booleani in una ricerca su Google per capirlo.Condizioni condizionali di definizione di oggetti JavaScript - che è meglio?

Il primo che vedo più spesso:

var myNewObject = myNewObject ? myNewObject : function() { 
    // Code goes here. 
}; 

Il secondo sembra più conciso, ma ho visto solo uno o due posti, quindi non so se c'è uno standard o addirittura un nome per questo:

var myNewObject = myNewObject || function() { 
    // Code goes here. 
}; 

punto di vista funzionale, entrambi fanno la stessa cosa ed entrambi sembrano funzionare in tutti i browser posso testare in mia domanda è questa - che è meglio e perché.? Inoltre, mentre la prima definizione è essenzialmente un condizionale a linea singola ... come si chiama il secondo?

+0

il secondo è più comune imho. Almeno per le persone che conoscono la lingua ... – galambalazs

+0

Fantastico, qualcuno sa se questo funziona anche con il prototipo: ad esempio Array.prototype.forEach = Array.prototype.forOach || funzione (... ti sto chiedendo perché sul sito Mozilla usano un normale if (! Array.prototype.for Anyach) Array.prototype.forEach = function (... –

+0

@Marco Demaio Seguendo la stessa logica * dovrebbe * funzionare Suggerisco di schiaffeggiarlo in uno script di test e vedere se lo fa.Stai ancora definendo un metodo di oggetto ... si trova già in uno spazio dei nomi specifico. – EAMann

risposta

5

io sceglierei la seconda se non altro per il fatto che si digita myNewObject due volte invece di tre volte.

Inoltre, mentre la prima definizione è essenzialmente un condizionale a linea singola ... come si chiama il secondo?

Short-circuit evaluation

+2

Accettare questo come risposta poiché mi hai dato anche il nome del secondo approccio. Avrebbe risparmiato tanto tempo se avessi saputo come si chiamava ... Non sapevo che fosse un approccio legittimo, solo che sembrava funzionare. – EAMann

1

FWIW Vedo il secondo approccio più spesso, e (per parte mia) ritengo sia più chiaro, conciso e idiomatico.

5

Vorrei utilizzare il secondo esempio, che è descritto come (Eval minimo). È più semplice e sembra più leggibile.

È proprio come ottenere un evento dal metodo onClick su più browser.

element.onclick = function (evt) { 
    evt = evt || window.event 
} 
+1

+1 per l'esempio – galambalazs

2

Quest'ultimo, è simile all'operatore nullo fondono in C# ?? quando usati in tale modo

veda: Is there a "null coalescing" operator in JavaScript?

+1

Nota che non è completamente equivalente, '??' in C# restituirà il valore predefinito solo quando il suo valore di operando a sinistra è 'null', in JavaScript' || 'lo farà quando il suo primo operando è * falsy *, falsy i valori sono: 'null',' undefined', '0',' NaN', stringa vuota e 'false'. – CMS

+0

@ CMS, sì, quindi il link per chiarimenti. Avrei dovuto scrivere che è * simile * all'operatore '??' – CaffGeek

0

Entrambi i metodi di lavoro. ma penso che la versione più ottimizzata è quello di utilizzare semplicemente un normale se test come:

if(!myNewObject) 
    myNewObject = ... 

Fare in uno qualsiasi del metodo lei suggerisce nella sua risposta, che potrebbe comportare un cambiamento di inutile ogni volta che la funzione/oggetto è già definito. Voglio dire se myNewObject è già definito, il runtime JavaScript dovrebbe eseguire una riassegnazione non necessaria myNewObject = myNewObject (a meno che il runtime non lo ottimizzi).

Sul sito Web di Mozilla si suggerisce di utilizzare un semplice if, view this.

Problemi correlati