[]
è un array.
Questo array non è affatto utilizzato.
Viene messo sulla pagina, perché l'uso di un array ti dà accesso a prototipi di array, come .forEach
.
Questo è solo più veloce della digitazione Array.prototype.forEach.call(...);
Successivamente, forEach
è una funzione che accetta una funzione come input ...
[1,2,3].forEach(function (num) { console.log(num); });
... e per ogni elemento in this
(dove this
è simile ad array, in quanto ha un length
e puoi accedere alle sue parti come this[1]
) passerà tre cose:
- l'elemento nella matrice
- l'indice dell'elemento (passerebbe il terzo elemento
2
)
- un riferimento alla matrice
Infine, .call
è un prototipo che le funzioni hanno (è una funzione che viene chiamata su altre funzioni).
.call
prenderà il suo primo argomento e sostituirà this
la normale funzione con qualunque cosa tu abbia passato call
, come il primo argomento ( undefined
o null
userà window
in JS di tutti i giorni, o sarà qualunque cosa tu abbia passato, se in "modalità rigorosa"). Il resto degli argomenti verrà passato alla funzione originale.
[1, 2, 3].forEach.call(["a", "b", "c"], function (item, i, arr) {
console.log(i + ": " + item);
});
// 0: "a"
// 1: "b"
// 2: "c"
Pertanto, stai creando un modo rapido per chiamare la forEach
funzione e stai passando this
dall'array vuoto a un elenco di tutti i <a>
tag e per ciascuno <a>
in ordine, stai chiamando la funzione fornita.
MODIFICARE
Conclusione logica / Pulizia
Di seguito, c'è un link a un articolo che suggerisce che eliminiamo i tentativi di programmazione funzionale e ci atteniamo sempre al loop manuale, in linea, perché questa soluzione è hack-ish e antiestetica.
Direi che, mentre .forEach
è meno utile rispetto ai suoi omologhi, .map(transformer)
, .filter(predicate)
, .reduce(combiner, initialValue)
, serve ancora scopi quando tutti si vuole veramente fare è modificare il mondo esterno (non l'array), n-volte, pur avendo accesso a uno arr[i]
o i
.
Quindi, come possiamo gestire la disparità, dato che Motto è chiaramente un ragazzo di talento e ben informato, e vorrei immaginare di sapere cosa sto facendo / dove sto andando (ora e poi ... ... altro volte è il primo apprendimento)?
La risposta è in realtà abbastanza semplice e qualcosa a cui lo zio Bob e Sir Crockford avrebbero dovuto far fronte entrambi, a causa della svista:
puliscilo .
function toArray (arrLike) { // or asArray(), or array(), or *whatever*
return [].slice.call(arrLike);
}
var checked = toArray(checkboxes).filter(isChecked);
checked.forEach(listValues);
Ora, se ti stai chiedendo se devi farlo tu stesso, la risposta potrebbe non essere ...
Questa cosa esatta è fatta da ... ... ogni (?) Libreria con caratteristiche di ordine superiore in questi giorni.
Se stai usando lodash o underscore o persino jQuery, avranno tutti un modo per prendere un insieme di elementi ed eseguire un'azione n-volte.
Se non stai usando una cosa del genere, allora scrivilo tu stesso.
lib.array = (arrLike, start, end) => [].slice.call(arrLike, start, end);
lib.extend = function (subject) {
var others = lib.array(arguments, 1);
return others.reduce(appendKeys, subject);
};
Aggiornamento per ES6 (ES2015) e oltre
Non solo un metodo di supporto slice( )
/ array( )
/ etc renderà la vita più facile per le persone che vogliono usare gli elenchi proprio come usano gli array (come dovrebbero), ma per le persone che hanno il lusso di operare in browser ES6 + relativamente vicini futuro, o di "traspiling" in Babel oggi, hai funzionalità linguistiche integrate, che rendono questo tipo di cose inutili.
function countArgs (...allArgs) {
return allArgs.length;
}
function logArgs (...allArgs) {
return allArgs.forEach(arg => console.log(arg));
}
function extend (subject, ...others) { /* return ... */ }
var nodeArray = [ ...nodeList1, ...nodeList2 ];
Super-pulito e molto utile.
Cerca gli operatori Rest e Spread ; provali sul sito BabelJS; se il tuo stack tecnologico è in ordine, usali in produzione con Babel e un passaggio di costruzione.
Non c'è alcun buon motivo per non essere in grado di usare la trasformazione da non-array in array ... ... semplicemente non fare confusione con il tuo codice non facendo altro che incollare la stessa brutta linea, ovunque.