Подтвердить что ты не робот

Почему аргумент функции не является объектом массива в Javascript?

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

4b9b3361

Ответ 1

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

Понятие объекта 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.

Ответ 2

Объект 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 не является массивом.

Ответ 3

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

С точки зрения функции одна причина может заключаться в том, что вы не можете - очевидно - фактически изменить аргументы, которые были переданы вам. Вы можете изменить массив, представляющий аргументы, переданные вам, но аргументы, которые были переданы, установлены в камне до того, как вы когда-либо получите область выполнения.

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

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

Ответ 4

Аргументы

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