[]
est un tableau.
Ce tableau n'est pas du tout utilisé.
Il est mis sur la page, car l'utilisation d'un tableau vous donne accès à des prototypes de tableau, comme .forEach
.
C'est juste plus rapide que de taper Array.prototype.forEach.call(...);
Ensuite, forEach
est une fonction qui prend une fonction comme entrée ...
[1,2,3].forEach(function (num) { console.log(num); });
... et pour chaque élément dans this
(où this
est semblable à un tableau, en ce qu'il a un length
et vous pouvez accéder à ses parties comme this[1]
), il passera trois choses:
- l'élément dans le tableau
- l'index de l'élément (le troisième élément passerait
2
)
- une référence au tableau
Enfin, .call
est un prototype dont disposent les fonctions (c'est une fonction qui est appelée sur d'autres fonctions).
.call
prendra son premier argument et remplacera l' this
intérieur de la fonction régulière par tout ce que vous avez passé call
, comme premier argument ( undefined
ou null
utilisera window
dans JS de tous les jours, ou sera ce que vous avez passé, si vous êtes en "mode strict"). Le reste des arguments sera transmis à la fonction d'origine.
[1, 2, 3].forEach.call(["a", "b", "c"], function (item, i, arr) {
console.log(i + ": " + item);
});
// 0: "a"
// 1: "b"
// 2: "c"
Par conséquent, vous créez un moyen rapide d'appeler la forEach
fonction, et vous passez this
du tableau vide à une liste de toutes les <a>
balises, et pour chaque <a>
ordre, vous appelez la fonction fournie.
ÉDITER
Conclusion logique / nettoyage
Ci-dessous, il y a un lien vers un article suggérant que nous abandonnons les tentatives de programmation fonctionnelle et que nous nous en tenons à la boucle manuelle en ligne, à chaque fois, car cette solution est hack-ish et inesthétique.
Je dirais que tout .forEach
est moins utile que ses homologues, .map(transformer)
, .filter(predicate)
, .reduce(combiner, initialValue)
, il sert toujours quand des fins tout ce que vous voulez vraiment faire est de modifier le monde extérieur ( et non le tableau), le n-temps, tout en ayant accès à une ou l' autre arr[i]
ou i
.
Alors, comment gérer la disparité, car Motto est clairement un gars talentueux et compétent, et j'aimerais imaginer que je sais ce que je fais / où je vais (de temps en temps ... autre fois c'est l'apprentissage tête première)?
La réponse est en fait assez simple, et quelque chose que l'oncle Bob et Sir Crockford feraient tous les deux facepalm, en raison de l'oubli:
nettoyez-le .
function toArray (arrLike) { // or asArray(), or array(), or *whatever*
return [].slice.call(arrLike);
}
var checked = toArray(checkboxes).filter(isChecked);
checked.forEach(listValues);
Maintenant, si vous vous demandez si vous avez besoin de faire cela, vous-même, la réponse pourrait bien être non ...
Cette chose exacte est faite par ... ... chaque (?) Bibliothèque avec des fonctionnalités d'ordre supérieur ces jours-ci.
Si vous utilisez lodash ou un trait de soulignement ou même jQuery, ils auront tous un moyen de prendre un ensemble d'éléments et d'exécuter une action n fois.
Si vous n'utilisez pas une telle chose, alors écrivez la vôtre.
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);
};
Mise à jour pour ES6 (ES2015) et au-delà
Non seulement une méthode d'assistance slice( )
/ array( )
/ etc va faciliter la vie des personnes qui souhaitent utiliser des listes comme elles utilisent des tableaux (comme elles le devraient), mais aussi pour les personnes qui ont le luxe de fonctionner dans les navigateurs ES6 + du relativement proche futur, ou de "transpilage" dans Babel aujourd'hui, vous avez des fonctionnalités de langage intégrées, qui rendent ce type de chose inutile.
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 propre et très utile.
Recherchez les opérateurs Rest et Spread ; essayez-les sur le site BabelJS; si votre pile technologique est en ordre, utilisez-les en production avec Babel et une étape de construction.
Il n'y a aucune bonne raison de ne pas pouvoir utiliser la transformation de non-tableau en tableau ... ... ne faites pas un gâchis de votre code en ne faisant rien d'autre que coller cette même ligne laide, partout.