Dévoilement du mécanisme d'Array.prototype.slice.call
Array.prototype.slice.call est un outil polyvalent qui nous accorde le capacité à transformer des arguments en véritables tableaux. Cependant, le mécanisme sous-jacent à cette transformation peut sembler énigmatique.
Dans des circonstances normales, lors de l'appel de .slice(), la fonction s'attend à ce que son entrée soit un tableau. Il procède par itération sur ce tableau, exécutant méticuleusement ses opérations.
Ce qui rend ce processus intrigant est le comportement étrange de .slice() lorsqu'il est appliqué aux arguments. En règle générale, les arguments ne constituent pas un tableau lui-même. Au contraire, il possède une structure semblable à un tableau, doté d'une propriété .length et d'un assortiment d'indices numériques. Cela confère à .slice() la flexibilité de supposer que arguments est un tableau, lui permettant d'effectuer ses opérations de manière transparente.
La clé de cette transformation réside dans les méthodes call() et apply(). Ces méthodes nous permettent d'attribuer manuellement la valeur this d'une fonction à un objet spécifique. En définissant la valeur this sur notre objet de type tableau, nous faisons essentiellement croire à .slice() qu'il fonctionne avec un tableau réel.
Pour illustrer ce concept, considérons l'objet simple suivant :
var my_object = { '0': 'zero', '1': 'one', '2': 'two', '3': 'three', '4': 'four', length: 5 };
Bien que my_object ne soit pas un tableau, nous pouvons exploiter .slice() pour extraire ses valeurs en le définissant comme valeur this :
var sliced = Array.prototype.slice.call( my_object, 3 );
Comme le montre la sortie de la console, le résultat array contient les éléments souhaités :
['three','four'];
En substance, lorsque nous employons Array.prototype.slice.call avec l'objet arguments, la mécanique est identique. L'objet arguments, bien qu'il ne s'agisse pas d'un tableau, reflète suffisamment sa structure pour tromper .slice() et lui faire effectuer ses opérations comme s'il s'agissait d'un tableau.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!