Почему аргументы функции не являются объектом массива в Javascript? - PullRequest
48 голосов
/ 14 июля 2010

Поскольку кажется, что первое, что делают люди, - это конвертирует arguments в реальный массив, меня интересует, почему авторы и исполнители языка Javascript решили и продолжают думать, что arguments не должно не будь настоящим Array. Я не имею в виду это как приманку, я искренне заинтересован в том, что стоит за этим. Поскольку функция вызывается естественным образом, когда вы находитесь в ее теле, я не думаю, что это потому, что объекты, на которые ссылаются arguments, могут измениться, как в случае некоторых результатов DOM ...

Ответы [ 4 ]

44 голосов
/ 14 июля 2010

Моя гипотеза:

Концепция объекта arguments существует в языке с самого начала, она даже описана в ECMAScript First Edition Standard (PDF) .

В этой версии ECMAScript Array.prototype был действительно базовым, объекты массива содержали только 4 метода! : toString, join, reverse и sort.

Я думаю, что это одна из основных причин того, что они arguments наследуются от Object.prototype, тогда эти методы Array не выглядели слишком полезными .

Но объект Array.prototype был расширен в следующих версиях стандарта, теперь в ES5 объекты Array имеют такие методы, как map, reduce, every, some и т. Д., Которые действительно мощный .

В прошлом году в ES5 было предложено сделать наследование arguments от Array.prototype на черновой стадии стандарта, но позднее оно было исключено.

В этих черновиках arguments унаследовано от Array.prototype, но для обратной совместимости с ES3 объект arguments определил два собственных свойства, toString и toLocaleString, оба указывают на одни и те же методы в Object.prototype, но, наконец, комитет решил продолжить наследование от Object.prototype.

28 голосов
/ 14 июля 2010

Объект arguments имеет очень необычную особенность, состоящую в том, что его подобные массиву элементы являются синонимами для локальных переменных, которые содержат аргументы функции.Например:

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
}

У меня всегда было впечатление, что это "магическое поведение" является причиной, по которой arguments не является массивом.

5 голосов
/ 14 июля 2010

Важно отметить, что без присутствия одного из дизайнеров мы можем только догадываться, почему .Но мы можем придумать несколько приличных причин ... вот моя:

С точки зрения функции, одной из причин может быть то, что вы не можете - очевидно - фактически изменить аргументы, которые были переданы вам.Вы можете изменить массив, представляющий переданные вам аргументы, но аргументы по мере того, как они были переданы устанавливаются в камне, прежде чем вы когда-либо получите область выполнения.массивов, и если вы сделали это с arguments объектом, то вы просто разрушили то, что концептуально является неизменной структурой ( печальное лицо! ).Конструкция объекта реальных аргументов ближе к некой неизменности, которую может предложить JavaScript.

Это похоже на параметры строки запроса.Вы получаете коллекцию, переданную вам клиентом, отправляющим запрос.Это часть информации запроса, которая уже установлена ​​и выполнена.

3 голосов
/ 14 июля 2010

arguments не просто возвращает аргументы. Возвращает объект вызываемого и массив аргументов. Если бы это был просто массив, первый элемент мог бы быть объектом вызываемого абонента и был бы более запутанным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...