Je parcourais juste le code source de Sizzle et je suis tombé sur cette ligne de code:
array = Array.prototype.slice.call( array, 0 );
J'ai recherché ce qu'est la fonction, mais je suis arrivé à la conclusion qu'elle renvoie juste tous les éléments du tableau à partir de l'index 0, et met le tout dans le tableau, c'est-à-dire qu'elle ne fait vraiment rien du tout.
Quelle est donc l'utilité de cette ligne de code? Qu'est-ce que je rate?
Modifier: C'est la ligne 863 de https://github.com/jquery/sizzle/blob/master/sizzle.js#L86 .
Le DOM renvoie généralement un NodeList
pour la plupart des opérations comme getElementsByTagName
.
Bien qu'un NodeList
ressemble presque à un tableau, ce n'est pas le cas. Il a une propriété length
comme un tableau, et une méthode item(index)
pour accéder à un objet à l'index donné (également accessible avec le [index]
notation), mais c'est là que s'arrête la similitude.
Donc, pour pouvoir utiliser les merveilleuses méthodes de tablea sans les réécrire toutes pour un NodeList
, la ligne ci-dessus est utile.
Une autre utilisation de la conversion en tableau est de rendre la liste statique. Les listes de nœuds sont généralement actives, ce qui signifie que si des modifications de document se produisent, l'objet NodeList est automatiquement mis à jour. Cela pourrait causer des problèmes si un objet jQuery vous revenait continuellement sous votre nez. Essayez ce qui suit extrait pour tester la vivacité des NodeLists.
var p = document.getElementsByTagName('p');
console.log(p.length); // 2
document.body.appendChild(document.createElement('p'));
// length of p changes as document was modified
console.log(p.length); // 3
Ce qui se passe ici, c'est que Sizzle crée un tableau réel à partir d'un objet de type tableau. L'objet de type tableau n'a pas nécessairement la méthode slice (), donc la méthode prototype doit être appelée directement. makeArray()
renvoie une copie de cet objet de type tableau qui est un tableau réel, et peut être utilisé comme tel ailleurs.
Voir ici pour plus d'informations sur les objets de type tableau.
Comme le dit BoltClock, il crée une copie (superficielle) d'un tableau. Il peut également être utilisé pour copier quelque chose qui est presque un tableau, tel que le composant intégré arguments
, qui a une longueur et des éléments mais pas de tableau dans sa chaîne de prototype (et donc pas de tranche méthode).