2016-03-09 36 views
5

Ho appena iniziato a lavorare in un nuovo progetto che funziona con TypeScript. Sto arrivando da un altro progetto che ha funzionato anche con TypeScript. Dal momento che è disponibile il nativo per il ciclo in TypeScript, abbiamo deciso (vecchio team di progetto) di utilizzare questo. Espacialy per me è stato molto più comodo scrivere il ciclo for, in relazione al mio background java.Dovremmo usare _.foreach() o meglio il nativo per il ciclo in TypeScript

Ora nel nuovo progetto usano ovunque il ciclo _.foreach() per iterare su array.

Quello che mi chiedo, c'è una differenza di prestazioni tra il dattiloscritto del nativo per e _.foreach()

ho creato un piccolo test in jsperf essi cucitura a essere più o meno esattamente stessa velocità ...

https://jsperf.com/foreach-vs-forof/12

dattiloscritto Per di

for (let num: string of list){ 
    console.log(num); 
} 

In JavaScript

var list = "9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9".split(); 

//Transpiled TypeScript for of  | **19,937 ±5.04% 
for (var _i = 0, list_1 = list; _i < list_1.length; _i++) { 
    var num = list_1[_i]; 
    console.log("" + num); 
} 

//lodash       | 20,520 ±1.22% 
_.forEach(list, function(item) { 
    console.log("" + item) 
}); 

Imho preferirei il "nativo" di da TypeScript perché è più leggibile per me.

Cosa suggerisci di usare? Ci sono altri punti da usare per o meglio _.for Ogni

risposta

2

Non posso commentare su lodash, non l'ho usato. Ma sotto c'è qualche background che può aiutare.

"Per of" è stato introdotto in TypeScript 1.5 per il looping attorno a ciascun elemento, ad es. un elenco di array. Se si esamina l'output JS (e in base a se si sta utilizzando lo Script ECMA 5 o 6), si dovrebbe trovare che nel caso di ECMASCript5 l'output di entrambi i sotto sarà identico. See this article for associated background reading e in che modo il targeting per ES6/2015 influirà sull'output.

Per quanto riguarda l'implementazione di Typescript di ForEach, vi è un'interessante discussione su GitHub here su questo. Soprattutto attorno alla rottura condizionale del ciclo.

for (let line of v.lineEntry) { 

} 

for (var _i = 0, list_1 = list; _i < list_1.length; _i++) { 

} 
2

Sulla base della sua prova ho aggiunto un altro, utilizzando il nativo Array.prototype.forEach:

list.forEach(function(item) { 
    console.log("" + item) 
}); 

Questo è infatti il ​​mio modo preferito dal momento che è in realtà molto più facile da digitare. Inoltre è più vicino ad altre cose che potresti voler fare con array ad es. map/filter ecc.

Nota che http://jsperf.com/foreach-vs-forof/9 tutti e tre non hanno alcuna differenza di prestazioni plausibile.

2

Non ho alcuna esperienza con dattiloscritto oltre la mia lettura, ma ho un bel po 'di esperienza con ES6/ES2015. for of era ed è ancora parte della specifica ES2015 che è stata finalizzata. Vorrei leggere l'articolo this su for of da MDN.

Qui sono alcune somiglianze e le differenze di for of e forEach (e questi sono solo quanto ho trovato e so di attualmente):

  • forEach in lodash lavora su collezioni che sono array, oggetti, o stringhe.

  • nativo forEach funziona su matrici, mappe e set.

  • for of opere in tutto Iterables: Array, stringhe, TypedArrays, mappe di insiemi, collezioni DOM, e generatori.

Vorrei leggere questo capitolo for of da Exploring ES6 (Exploring ES6 è un grande letto. E 'molto approfondita. E' gratuito anche online.) Alcune cose da esso che si distinguono per me come diverso for of che aren 't in forEach.

pausa e continuare a lavorare all'interno per-loop di

break e continue non sono esposte in forEach. La cosa più vicina che puoi ottenere a continue in forEach è l'utilizzo di return che in realtà è praticamente la stessa cosa. Per quanto riguarda lo break anche se non vedo alternative (ma non lo sconto, perché la maggior parte delle cose che hanno bisogno di pause come trovare e restituire un singolo oggetto sono già coperte in gran parte della biblioteca di lodash).

Se Object.entries arriva in ES2017 come proposto, è possibile anche iterare gli oggetti con proprietà e valori enumerabili con facilità e precisione. Se si desidera utilizzarlo ora è possibile con uno dei polyfills here. Ecco un esempio di come sarebbe.

var obj = {foo: "bar", baz: "qux"}; 

for (let x of Object.entries(obj)) { // OK 
    console.log(x); // ["foo", "bar"], ["baz", "qux"] 
} 

e s' here un'implementazione con una rapida polyfill che ho scritto. Normalmente si userebbe anche la destrutturazione dell'array, che separerebbe la chiave e il valore nelle proprie variabili.

forEach 's var default è il tipo di funzionalità che si otterrebbe da let in un for o for of ciclo che è una buona cosa. Quello che intendo è che se c'è qualcosa di asincrono che accade all'interno della variabile per quell'iterazione sarà circoscritto solo alla parte particolare di quel ciclo. Questa proprietà di forEach non ha veramente a che fare con let, ma con scope e chiusure in JavaScript.

Tra forEach e for of non vi resta che decidere quale è meglio per il lavoro in corso (ad esempio Avete bisogno break s o necessità di utilizzare Mappe, Imposta o generatori utilizzano for of). Oltre a ciò, mi sembra che non ci siano ragioni particolarmente forti per le collezioni in cui entrambe operano con le loro funzionalità principali. Anche quando si tratta di collezioni che possono utilizzare sia lo forEach o lo for of, si tratta principalmente di preferenze personali poiché fanno la stessa cosa alla stessa velocità (e le velocità potrebbero cambiare in qualsiasi momento secondo l'interprete).Sento che i particolari vantaggi di lodash sono per le altre sue varie funzioni che potrebbero farti risparmiare molto tempo dalla scrittura del codice come mappa, riduzione, filtro e ricerca. Dal momento che ti senti più a tuo agio scrivendo for of ti suggerisco di continuare a scriverlo in questo modo, ma una volta che inizi a scrivere in lodash usando le sue altre funzioni potresti iniziare a sentirti più a tuo agio scrivendolo in modo speciale.

Edit:

Guardando oltre il codice ho notato un errore con la creazione della lista. Alla fine hai appena avuto .split() e avresti dovuto avere .split(","). Stavi creando un elenco di lunghezza 1 dell'intera stringa e iterando una volta su quella stringa, motivo per cui i benchmark erano così simili. Riesero i test. Here sono. Non mi preoccuperei ancora delle prestazioni tanto che sembra cambiare ogni volta che viene eseguito.