JavaScript: sfumature di myArray.forEach vs for loop

Ho visto molte domande che suggeriscono di utilizzare:

for (var i = 0; i < myArray.length; i++){ /* ... */ } 

invece di:

 for (var i in myArray){ /* ... */ } 

per gli array, a causa dell’iterazione incoerente ( vedere qui ).


Tuttavia, non riesco a trovare nulla che sembra preferire il ciclo orientato agli oggetti:

 myArray.forEach(function(item, index){ /* ... */ }); 

Il che sembra molto più intuitivo per me.

Per il mio progetto attuale, la compatibilità di IE8 è importante, e sto prendendo in considerazione l’utilizzo del polyfill di Mozilla , tuttavia non sono sicuro al 100% di come funzionerà.

  • Ci sono differenze tra lo standard for loop (il primo esempio sopra) e Array.prototype.for Ogni implementazione dai browser moderni?
  • Ci sono differenze tra le moderne implementazioni dei browser e l’implementazione di Mozilla collegata a quella precedente (con particolare riguardo a IE8)?
  • Le prestazioni non sono tanto un problema, ma solo la coerenza con le proprietà su cui è stata ripetuta l’iterazione.

La differenza più sostanziale tra il ciclo for e il metodo forEach è che, con il primo, è ansible uscire dal ciclo. Puoi simulare continue semplicemente tornando dalla funzione passata a forEach , ma non c’è modo di fermare del tutto il ciclo.

A parte questo, i due realizzano efficacemente la stessa funzionalità. Un’altra piccola differenza riguarda l’ambito dell’indice (e tutte le variabili contenenti) nel ciclo for, a causa del sollevamento variabile.

 // 'i' is scoped to the containing function for (var i = 0; i < arr.length; i++) { ... } // 'i' is scoped to the internal function arr.forEach(function (el, i) { ... }); 

Tuttavia, trovo che forEach sia molto più espressivo, rappresenta il tuo intento di scorrere ogni elemento di un array e ti fornisce un riferimento all'elemento, non solo l'indice. Complessivamente, si tratta principalmente di gusti personali, ma se si può usare per forEach , mi consiglia di usarlo.


Ci sono alcune differenze più sostanziali tra le due versioni, in particolare per quanto riguarda le prestazioni. In effetti, il ciclo for semplice ha prestazioni notevolmente migliori rispetto al metodo forEach , come dimostrato da questo test jsperf .

Se tale prestazione sia necessaria o meno per te, dipende da te decidere e, nella maggior parte dei casi, favorirei espressività oltre la velocità. Questa differenza di velocità è probabilmente dovuta alle minori differenze semantiche tra il loop di base e il metodo quando si opera su array sparsi, come indicato in questa risposta .

Se non è necessario il comportamento di forEach e / o è necessario interrompere anticipatamente il ciclo, è ansible utilizzare _.each di Lo-Dash come alternativa, che funzionerà anche su browser. Se si sta utilizzando jQuery, fornisce anche $.each simile, basta notare le differenze negli argomenti passati alla funzione di callback in ogni variazione.

(Come per il polyfill per forEach , dovrebbe funzionare nei vecchi browser senza problemi, se si sceglie di percorrere quella rotta.)

Puoi usare la tua funzione foreach personalizzata che funzionerà molto meglio di Array.forEach

Dovresti aggiungere questo una volta al tuo codice. Questo aggiungerà una nuova funzione alla matrice.

 function foreach(fn) { var arr = this; var len = arr.length; for(var i=0; i 

Quindi puoi usarlo ovunque come Array.forEach

 [1,2,3].customForEach(function(val, i){ }); 

L'unica differenza è 3 volte più veloce. https://jsperf.com/native-arr-foreach-vs-custom-foreach

AGGIORNAMENTO: nella nuova versione di Chrome è stata migliorata la performance di .forEach (). Tuttavia, la soluzione può fornire prestazioni aggiuntive in altri browser.

JSPerf

Alcuni sviluppatori (ad esempio Kyle Simpson) .forEach usare .forEach per indicare che l’array avrà un effetto collaterale e .map per le funzioni pure. for cicli in questa equazione, quindi, a mio parere, rientrano in questa equazione come una soluzione generica che è più facile da comunicare in quanto è supportata su una pletora di lingue esp quando il numero di iterazioni è precalcolato.