Puisqu'il semble que la première chose que les gens font est de convertir arguments
dans un vrai tableau, je suis intéressé par la raison pour laquelle les auteurs et les implémenteurs du langage Javascript ont décidé, et continuent de penser, que arguments
devrait pas être un réel Array
. Je ne veux pas dire que c'est de la poudre aux yeux, je suis sincèrement intéressé par le raisonnement qui se cache derrière. Puisque la fonction est naturellement appelée lorsque vous êtes dans son corps, je ne pense pas que ce soit parce que les objets arguments
peuvent changer, comme avec certains des résultats de DOM...
Réponses
Trop de publicités?Ma conjecture :
Le concept de la arguments
L'objet est présent dans la langue depuis le tout début, il est même décrit dans le livre d'or de l'Union européenne. Norme ECMAScript première édition (PDF) .
Dans cette version de l'ECMAScript, l'élément Array.prototype
était vraiment basique, les objets de type tableau contenaient seulement 4 méthodes ! : toString
, join
, reverse
y sort
.
Je pense que c'est l'une des raisons principales pour lesquelles ils font arguments
d'hériter de Object.prototype
à l'époque, ces méthodes Array ne semblaient pas trop utile .
Mais le Array.prototype
a été étendu dans les versions suivantes de la norme, maintenant sur ES5, les objets Array ont des méthodes telles que map
, reduce
, every
, some
etc, qui sont vraiment puissant .
L'année dernière, il y a eu une proposition dans ES5 de faire de la arguments
hériter de Array.prototype
dans les étapes du projet de norme, mais a été abandonnée un peu plus tard.
Dans ces brouillons, arguments
hérité de Array.prototype
mais pour des raisons de rétrocompatibilité avec ES3, l'option arguments
avait défini deux propriétés propres, toString
y toLocaleString
qui pointent toutes deux vers les mêmes méthodes sur Object.prototype
mais, finalement, le comité a décidé de continuer à hériter de l'héritage de l'Union européenne. Object.prototype
.
L'objet arguments présente la caractéristique très inhabituelle que ses éléments de type tableau sont des synonymes des variables locales qui contiennent les arguments de la fonction. Par exemple :
function f(x) {
console.log(arguments[0]); // Displays the initial value of the argument x
x = 5; // Changes the value of the local variable x
console.log(arguments[0]); // Now displays 5
}
J'ai toujours eu l'impression que ce "comportement magique" est la raison pour laquelle arguments
n'est pas un tableau.
Il est important de noter que sans la présence d'un des concepteurs, nous ne pouvons que conjecturer pourquoi . Mais on peut trouver des raisons valables... voici les miennes :
Du point de vue d'une fonction, une des raisons pourrait être que vous ne pouvez pas - évidemment - changer les arguments qui vous ont été passés. Vous pouvez changer un tableau qui représente les arguments qui vous ont été passés, mais les arguments comme ils ont été passés est gravé dans la pierre avant même que vous ne receviez le périmètre d'exécution.
Vous pouvez couper, découper et faire éclater des tableaux, et si vous faites ça à l' arguments
alors vous venez de ruiner ce qui est conceptuellement une structure immuable ( visage triste ! ). La conception de l'objet arguments réels est plus proche d'un type d'immuabilité que JavaScript peut offrir.
Il est similaire aux paramètres de la chaîne de requête. Le client qui envoie la requête vous remet une collection. Elle fait partie des informations de la requête, qui est déjà définie et terminée.