2013-01-08 12 views

risposta

9

È essenzialmente una funzione non operativa. Restituisce il valore di ciò che è stato passato in esso.

La parte su di esso viene utilizzata come "iteratore predefinito" all'interno della libreria stessa significa che in altre funzioni che possono avere un parametro "iteratore" facoltativo (che è probabilmente usato come una funzione da applicare a ciascun elemento di una matrice di qualche tipo), se non viene passato nessun parametro iteratore, la libreria userà questo iteratore "no-op" e gli elementi dell'array rimarranno invariati.

+4

Solo per il gusto: è possibile vedere questo noop nella [fonte annotata] (http://underscorejs.org/docs/underscore.html#section-118). –

+0

@DanLee, non posso contrassegnare il commento come risposta. – SunnyShah

+0

@SunnyShah Non è la mia risposta, solo il mio commento. Penso che tu possa segnare la risposta di Matt in pochi minuti. –

9

Un esempio specifico:

Underscore.js definisce _.each e come simili.

_.each = function(obj, iterator, context) { 
    ... 
} 

Questo iteratore mostra il valore. Forse hai usato questo idioma.

_.each([1, 2, 3], function(el){ 
    console.log(el); 
}); 

Questo iteratore restituisce il valore senza modifiche.

_.each([1, 2, 3], function(el){ 
    return el; 
}); 

La funzione che restituisce un valore senza modifiche si verifica frequentemente. Quindi Underscore.js vuole definire la funzione. Underscore.js nomina la funzione _.identity.

_.identity = function(value) { 
    return value; 
}; 

Se Underscore.js vuole usare un iteratore impostazione predefinita, tutti Underscore.js serve è chiamata _.identity.

_.each([1, 2, 3], _.identity); 
+0

Usando _.each puramente per restituire qualcosa non è suggerito, questo è ciò che _.map è per: '_.map ([1, 2, 3], funzione (el) { return el; }); ' È bene segnalare il tuo intento con il tuo codice. La sezione analoga di JavaScript e la mappa sono meglio separate, dal momento cheEach non raccoglie i risultati delle funzioni anche se in essa è presente un'istruzione di ritorno. –

28

Un modello di codice JavaScript che coinvolge l'identità sta filtrando i valori in base alla verità, ad es.

var a = [null, null, [1,2,3], null, [10, 12], null]; 

a.filter(_.identity) 

rese [matrice [3], matrice [2]].

Uso

_.compact(a) 

è chiara, ma non si può usare lodash o sottolineatura affatto, ad esempio

function identity(x) { 
    return x; 
} 

a.filter(identity) 

Che si tratti di un buon modello di codice è discutibile per diversi motivi, ma è in uso allo stato selvatico.

Non è un NOOP. Un NOOP è un costrutto imperativo, ad es. assembly, mentre nella programmazione funzionale, è come altre funzioni in quanto restituisce un valore. Se l'identità fosse un NOOP, allora tutte le funzioni pure potrebbero anche essere considerate noop, e non sarebbe una cosa sensata.

Problemi correlati