2015-10-28 2 views
1

Vous cherchez plus de détails sur ce qui se passe exactement quand suivant est exécuté:Comment l'objet 'arguments de JS est converti en tableau

function useArray(){ 
     var args = [].slice.call(arguments) 
     console.log(args) 
    } 

Comment se fait slice étant fonction avec 3 paramètres (tableau source, début et fin positions à copier) menaces arguments correctement? La méthode call a besoin de la valeur correcte du premier argument comme this mais il semble que arguments est transformé en objet Array?

Et pourquoi cela ne fonctionne pas:

var args = [].slice(arguments) 

Répondre

1

Nous utilisons [].slice pour obtenir à la méthode Array::slice. arguments n'a pas de slice(), mais est.

Bien qu'il soit un membre de Array, slice() va assez bien travailler sur des objets ressemblant à un tableau - les choses qui ont .length et peuvent être indexés avec [0..n].

slice() avec aucun paramètre renvoie une copie de l'ensemble du tableau. Ses arguments sont tous deux facultatifs.

Il est donc comme si argumentsavait une méthode slice(), et nous avons appelé arguments.slice() d'obtenir une copie de celui-ci (comme un tableau).

[].slice(arguments) est simplement appeler Array::slice() sur un tableau vide, avec arguments comme paramètre begin, qui n'a aucun sens depuis begin (le cas échéant) doit être un nombre.

+0

Merci beaucoup pour les explications détaillées. Il est maintenant clair pourquoi '[] .slice (arguments)' retourne un tableau vide. Encore une chose à vérifier. Ai-je raison de dire que [] .slice.call (arguments) 'passe l'objet' arguments' en tant que receveur de l'appel, cette méthode 'call()' de l'objet fonction est supposée avoir comme premier argument? –

+1

Si je lis bien, oui. C'est comme si "slice" était temporairement un membre de 'arguments' -' arguments' serait 'this' dans cet appel' slice'. –