È un caso con una continua un buon motivo per evitare la nidificazione eccessivo, mentre l'iterazione di immobili a JavaScript?
-
04-10-2019 - |
Domanda
Io di solito utilizzare questo modello per scorrere le proprietà degli oggetti:
for(var property in object) {
if(object.hasOwnProperty(property)) {
...
}
}
Non mi piace questo rientro eccessivo e di recente è stato sottolineato a me che ho potuto sbarazzarsi di esso in questo modo:
for(var property in object) {
if(!object.hasOwnProperty(property)) {
continue;
}
...
}
Mi piace questo perché non introduce l'ulteriore livello di indentazione. È questo il modello va bene, o ci sono modi migliori?
Soluzione
Io personalmente preferisco:
for(var property in object) if(object.hasOwnProperty(property)) {
...
}
Non v'è alcun ulteriore livello di rientro perché for
, if
, ecc avrà l'istruzione successiva se si lascia fuori le parentesi graffe. Dal momento che abbiamo messo tutto il nostro codice all'interno del blocco if hasOwnProperty
rende eventuali sostegni per l'istruzione for
superfluo.
Essenzialmente è equivalente a:
for(var property in object) {
if(object.hasOwnProperty(property)) {
...
} else {
continue;
}
}
Altri suggerimenti
Syntacticly Io preferirei qualcosa di simile
function own(obj) {
var ownprops = {};
for (var prop in obj)
if (obj.hasOwnProperty(prop)) ownprops[prop] = 1;
return ownprops;
}
for (var property in own(object)) {
//code
}
Sembra bello, ma comporta due anelli per lo stesso oggetto, non abbastanza le prestazioni saggio.
L'altro modo per farlo è functionaly
function foreach(obj, func, thisp) {
for (var prop in obj)
if (obj.hasOwnProperty(prop)) func.call(thisp, obj[prop], prop);
}
foreach(object, function(val, key) {
//code
});
Un solo ciclo, ma una funzione viene chiamata per ogni iterazione, che non è grande prestazione saggio, ma migliore di quello precedente soluzione. Si noti che clobbers anche il valore di this
, ma si può passare che il valore in modo esplicito come il terzo argomento opzionale.
Solo alcune alternative. Il modo in cui si sta facendo, e il modo in cui ha spiegato da Daniel è bene, e senza compromessi di prestazioni.
Inoltre, vorrei sottolineare che non si sono di rientrare il codice per ogni singola parentesi graffa ...
Un fattore dipende dal fatto che si ascolta Douglas Crockford. Nel suo libro, JavaScript:. The Good Parts, ha grumi continue
con il male parti
"Non ho mai visto un pezzo di codice che non è stata migliorata refactoring per rimuovere l'istruzione continue." - Douglas Crockford, JavaScript: le parti buone
Tim Giù di cui al suo commento, Crockford dà nessuna ragione nel libro per spiegare perché continue
dovrebbe essere evitato. Ma su suo sito dice, "Si tende ad oscurare il flusso di controllo di la funzione." Cito solo l'opinione di Crockford dal momento che molti lo considerano un'autorità.
Personalmente non vedo alcun problema con il modo che avete codificato il ciclo, tanto più che il continue
appare a destra in alto, dove non sarà facile essere trascurato. State lavorando con un team di sviluppatori? Hanno una buona comprensione di ciò continue
fa? Avete una convention codice del documento che parla di come gestire in profondità di nidificazione di dichiarazioni?
McConnel:
Un ciclo con molte interruzioni può indicare pensiero chiaro sulla struttura del loop o il suo ruolo nella codice circostante. pause eccessive solleva spesso indica che il ciclo potrebbe essere più chiaramente espresso in serie di cicli. L'utilizzo di rottura elimina la possibilità di trattare un ciclo come una scatola nera. il controllo di un condizione di uscita del loop con una sola dichiarazione per semplificare i loop. le forze di 'rompere' la persona che legge il tuo Codice a guardare dentro per capire la il controllo del ciclo, rendendo il ciclo più difficile da capire.
Dijkstra:
caratteristiche come pausa tendono ad sabotaggio i benefici della strutturati la programmazione, e prevenire la programmatore di comprendere il programma come composizione di unità indipendenti
Loops con Continua può essere preso in considerazione in questa forma e, quindi, il ciclo può essere trattato come una scatola nera. Crawford è sbagliato. Breaks odore, ma continuano è buono.
ulteriore analisi: http://sites.google.com/site / dustingetz / dev / break-e-continua