50 votes

Pourquoi l'objet arguments d'une fonction n'est pas un tableau en Javascript ?

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...

45voto

CMS Points 315406

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 .

29voto

Daniel Vassallo Points 142049

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.

5voto

Rex M Points 80372

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.

3voto

Andir Points 1353

Arguments ne retourne pas seulement les arguments. Il retourne l'objet appelé, et le tableau d'arguments. S'il s'agissait juste d'un tableau, le premier élément pourrait être l'objet du destinataire et être plus confus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X