javascript in - che uso ha il metodo javascript forEach (che la mappa non può fare)?




4 Answers

La differenza essenziale tra map e forEach nell'esempio è che forEach opera sugli elementi dell'array originale, mentre map restituisce esplicitamente un nuovo array come risultato.

Con forEach stai facendo qualche azione con - e opzionalmente cambiando - ogni elemento nell'array originale. Il metodo forEach esegue la funzione fornita per ogni elemento, ma non restituisce nulla ( undefined ). D'altra parte, la map attraversa l'array, applica una funzione a ciascun elemento ed emette il risultato come nuovo array .

L '"effetto collaterale" con forEach è che l'array originale viene modificato. "Nessun effetto collaterale" con la map significa che, nell'uso idiomatico, gli elementi dell'array originale non vengono modificati; il nuovo array è una mappatura uno-a-uno di ciascun elemento nell'array originale - la trasformazione di mappatura è la funzione fornita.

Il fatto che non ci sia alcun database coinvolto non significa che non dovrai operare su strutture dati, che, dopo tutto, sono una delle essenze della programmazione in qualsiasi lingua. Per quanto riguarda la tua ultima domanda, la tua matrice può contenere non solo numeri, ma anche oggetti, stringhe, funzioni, ecc.

object compatibility

L'unica differenza che vedo nella mappa e nel foreach è che la map sta restituendo un array e forEach non lo è. Tuttavia, non capisco nemmeno l'ultima riga del metodo func.call(scope, this[i], i, this); " func.call(scope, this[i], i, this); ". Ad esempio, non è " this " e " scope " che si riferiscono allo stesso oggetto e non è this[i] e i riferisco al valore corrente nel ciclo?

Ho notato su un altro post qualcuno ha detto "Usa forEach quando vuoi fare qualcosa sulla base di ciascun elemento della lista, ad esempio potresti aggiungere cose alla pagina. Essenzialmente, è ottimo per quando vuoi" effetti collaterali " . Non so cosa si intende per effetti collaterali.

Array.prototype.map = function(fnc) {
    var a = new Array(this.length);
    for (var i = 0; i < this.length; i++) {
        a[i] = fnc(this[i]);
    }
    return a;
}

Array.prototype.forEach = function(func, scope) { 
    scope = scope || this; 
    for (var i = 0, l = this.length; i < l; i++) {
        func.call(scope, this[i], i, this); 
    } 
}

Infine, ci sono degli usi reali per questi metodi in javascript (dato che non stiamo aggiornando un database) se non per manipolare numeri come questo:

alert([1,2,3,4].map(function(x){ return x + 1})); //this is the only example I ever see of map in javascript.

Grazie per qualsiasi risposta.




La risposta votata (da Ken Redler) è fuorviante.

Un effetto collaterale nell'informatica significa che una proprietà di una funzione / metodo altera uno stato globale [wiki] . In un senso stretto, questo può includere anche la lettura da uno stato globale, piuttosto che da argomenti. Nella programmazione imperativa o OO, gli effetti collaterali appaiono la maggior parte del tempo. E probabilmente lo stai facendo senza rendertene conto.

La differenza significativa tra forEach e map è che la map alloca la memoria e memorizza il valore restituito, mentre forEach getta via. Vedi emca spec per ulteriori informazioni.

Per quanto riguarda il motivo per cui le persone dicono che per forEach viene utilizzato quando si desidera un effetto collaterale è che il valore di ritorno di forEach è sempre undefined . Se non ha alcun effetto collaterale (non cambia lo stato globale), la funzione sta solo sprecando il tempo della CPU. Un compilatore ottimizzante eliminerà questo blocco di codice e lo sostituirà con il valore finale ( undefined ).

A proposito, va notato che JavaScript non ha restrizioni sugli effetti collaterali. È ancora possibile modificare l'array originale all'interno della map .

var a = [1,2,3]; //original
var b = a.map( function(x,i){a[i] = 2*x; return x+1} );
console.log("modified=%j\nnew array=%j",a,b);
// output:
// modified=[2,4,6]
// new array=[2,3,4]



Puoi usare la map come se fosse per forEach .

Farà più di quanto deve, tuttavia.

scope può essere un oggetto arbitrario; non è necessariamente this .

Per quanto riguarda se ci sono usi reali per la map e per forEach , anche per chiedere se ci sono usi reali for o for cicli.




Ancora una volta, mi sento come un negromante che aggiunge una risposta a una domanda che è stata posta 5 anni fa (fortunatamente c'è un'attività piuttosto recente, quindi non sono l'unico a disturbare i morti :).

Altri hanno già pubblicato sulla tua domanda principale riguardante la differenza tra le funzioni. Ma per...

ci sono dei veri usi per questi metodi in javascript (dato che non stiamo aggiornando un database) se non per manipolare numeri come questo:

... è divertente dovresti chiedere. Proprio oggi ho scritto un pezzo di codice che assegna un numero di valori da un'espressione regolare a più variabili usando la mappa per la trasformazione. È stato usato per convertire una struttura basata su testo molto complicata in dati visualizzabili ... ma per semplicità, offrirò un esempio usando le stringhe di data, perché probabilmente sono più familiari per tutti (anche se il mio problema era stato effettivamente con le date , invece della mappa avrei usato Date-object, che avrebbe svolto il lavoro splendidamente da solo).

const DATE_REGEXP = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})\.(\d{3})Z$/;
const TEST_STRING = '2016-01-04T03:20:00.000Z';

var [
    iYear,
    iMonth,
    iDay,
    iHour,
    iMinute,
    iSecond,
    iMillisecond
    ] = DATE_REGEXP
        // We take our regular expression and...
        .exec(TEST_STRING)
        // ...execute it against our string (resulting in an array of matches)...
        .slice(1)
        // ...drop the 0th element from those (which is the "full string match")...
        .map(value => parseInt(value, 10));
        // ...and map the rest of the values to integers...

// ...which we now have as individual variables at our perusal
console.debug('RESULT =>', iYear, iMonth, iDay, iHour, iMinute, iSecond, iMillisecond);

Quindi ... mentre questo era solo un esempio - e solo una trasformazione molto semplice per i dati (solo per esempio) ... averlo fatto senza mappa sarebbe stato un compito molto più noioso.

Certo, è scritto in una versione di JavaScript che non credo che troppi browser supportino ancora (almeno completamente) ma - ci stiamo arrivando. Se avessi avuto bisogno di eseguirlo nel browser, credo che sarebbe transpile bene.




Related