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

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

48
задан pr1001 13 July 2010 в 13:10
поделиться

4 ответа

Мои предположения:

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

44
ответ дан 7 November 2019 в 12:33
поделиться

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

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

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

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

5
ответ дан 7 November 2019 в 12:33
поделиться

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

28
ответ дан 7 November 2019 в 12:33
поделиться

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

3
ответ дан 7 November 2019 в 12:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: