per
for
i cicli sono molto più efficienti. È un costrutto di ciclo progettato specificamente per iterare mentre una condizione è vera , offrendo allo stesso tempo un meccanismo a passi (generalmente per aumentare l'iteratore). Esempio:
for (var i=0, n=arr.length; i < n; ++i ) {
...
}
Questo non vuol dire che for -loops sarà sempre più efficiente, ma solo che i motori JS ei browser li hanno ottimizzati per esserlo. Nel corso degli anni ci sono stati compromessi su quale costrutto di looping fosse più efficiente (for, while, reduce, reverse-while, ecc.) - diversi browser e motori JS hanno le proprie implementazioni che offrono metodologie differenti per produrre gli stessi risultati. Poiché i browser ottimizzano ulteriormente per soddisfare le esigenze di prestazioni, teoricamente [].forEach
potrebbe essere implementato in modo tale da essere più veloce o paragonabile a un file for
.
Benefici:
- efficiente
- terminazione anticipata del ciclo (onori
break
e continue
)
- controllo delle condizioni (
i<n
può essere qualsiasi cosa e non è vincolato alla dimensione di un array)
- scoping variabile (
var i
rimane i
disponibile dopo la fine del ciclo)
per ciascuno
.forEach
sono metodi che eseguono l'iterazione principalmente su array (anche su altri enumerabili, come Map
e Set
oggetti). Sono più recenti e forniscono un codice soggettivamente più facile da leggere. Esempio:
[].forEach((val, index)=>{
...
});
Benefici:
- non implica l'impostazione delle variabili (itera su ogni elemento dell'array)
- funzioni / funzioni-freccia fanno l'ambito della variabile al blocco
Nell'esempio sopra, val
sarebbe un parametro della funzione appena creata. Pertanto, qualsiasi variabile chiamata val
prima del ciclo manterrebbe i propri valori dopo la fine.
- soggettivamente più manutenibile in quanto potrebbe essere più facile identificare ciò che il codice sta facendo - iterando su un enumerabile; mentre un ciclo for potrebbe essere utilizzato per qualsiasi numero di schemi di loop
Prestazione
La performance è un argomento delicato, che generalmente richiede una certa esperienza quando si tratta di previdenza o approccio. Al fine di determinare in anticipo (durante lo sviluppo) quanta ottimizzazione può essere richiesta, un programmatore deve avere una buona idea dell'esperienza passata con il caso problema, nonché una buona comprensione delle potenziali soluzioni.
L'uso di jQuery in alcuni casi potrebbe essere troppo lento a volte (uno sviluppatore esperto potrebbe saperlo), mentre altre volte potrebbe non essere un problema, nel qual caso la conformità cross-browser della libreria e la facilità di eseguire altre funzioni (ad esempio, AJAX, gestione degli eventi) varrebbe il tempo risparmiato per lo sviluppo (e la manutenzione).
Un altro esempio è che, se le prestazioni e l'ottimizzazione fossero tutto, non ci sarebbe altro codice oltre alla macchina o all'assembly. Ovviamente non è così in quanto ci sono molti linguaggi diversi di alto e basso livello, ciascuno con i propri compromessi. Questi compromessi includono, ma non sono limitati a, specializzazione, facilità e velocità di sviluppo, facilità e velocità di manutenzione, codice ottimizzato, codice privo di errori, ecc.
Approccio
Se non hai una buona comprensione se qualcosa richiederà un codice ottimizzato, è generalmente una buona regola pratica scrivere prima codice gestibile. Da lì, puoi testare e individuare ciò che richiede maggiore attenzione quando è necessario.
Detto questo, alcune ovvie ottimizzazioni dovrebbero far parte della pratica generale e non richiedere alcun pensiero. Ad esempio, considera il seguente ciclo:
for (var i=0; i < arr.length; ++i ){}
Per ogni iterazione del ciclo, JavaScript recupera le arr.length
operazioni di determinazione dei costi di ricerca chiave su ogni ciclo. Non c'è motivo per cui questo non dovrebbe essere:
for (var i=0, n=arr.length; i < n; ++i){}
Questo fa la stessa cosa, ma recupera solo arr.length
una volta, memorizzando nella cache la variabile e ottimizzando il codice.