Так как на первую вещь кажется, что люди делают преобразование arguments
в действительный массив я интересуюсь тем, почему авторы языка сценариев JavaScript и реализаторы, решенные, и, продолжают думать, это arguments
не должно быть реальное Array
. Я не имею в виду это как flamebait, я искренне интересуюсь взглядами позади него. Так как функция естественно вызывается, когда Вы находитесь в ее теле, я не думаю, что это потому что объекты arguments
ссылаются может измениться, как с некоторыми результатами DOM...
Мои предположения:
Концепция объекта 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
.
Важно отметить, что без присутствия одного из дизайнеров мы можем только догадываться , почему . Но мы можем придумать несколько достойных причин ...вот мой:
С точки зрения функции, одна из причин может заключаться в том, что вы не можете - очевидно - фактически изменить переданные вам аргументы. Вы можете изменить массив, представляющий переданные вам аргументы, но аргументы в том виде, в котором они были переданы , высечены в камне еще до того, как вы когда-либо получите объем выполнения.
Вы можете объединять, нарезать кубики и вставлять массивы, и если вы сделали это с объектом arguments
, то вы просто испортили то, что является концептуально неизменной структурой ( грустное лицо! ). Дизайн реального объекта arguments ближе к разновидности неизменяемости, которую может предложить JavaScript.
Аналогичен параметрам строки запроса. Вы получаете коллекцию, которую передает вам клиент, отправивший запрос. Это часть информации запроса, которая уже настроена и выполнена.
Объект 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
не является массивом.
arguments не просто возвращает аргументы. Он возвращает вызываемый объект и массив аргументов. Если бы это был просто массив, первым элементом мог бы быть вызываемый объект, что могло бы сбить с толку.