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