Это обычное место, чтобы увидеть такой код в Интернете и в рамках:
var args = Array.prototype.slice.call(arguments);
При этом вы преобразовываете аргументы Object
в реальный Array
(так как JS имеет реальные массивы), и он позволяет использовать любые методы массива, которые у вас есть в прототипах Array, которые будут применяться к нему, и т.д. и др.
Я помню, где-то читал, что доступ к объекту arguments
напрямую может быть значительно медленнее, чем клон Array, или очевидный выбор именованных аргументов. Есть ли в этом правда и при каких обстоятельствах/браузерах это может привести к штрафу за производительность? Любые статьи по этому вопросу, о которых вы знаете?
обновить интересную находку от http://bonsaiden.github.com/JavaScript-Garden/#function.arguments, которая делает недействительными то, что я читал ранее... Надеюсь, что вопрос получит еще несколько ответов от таких @Ivo Wetzel, которые написали это.
В нижней части этого раздела говорится:
Мифы о действии и истины
Объект arguments всегда создается за исключением двух случаи, когда он объявлен как имя внутри функции или одной из ее формальные параметры. Это не имеет значения используется ли оно или нет.
это противоречит http://www.jspatterns.com/arguments-considered-harmful/, в котором говорится:
Однако не рекомендуется использовать аргументы по причинам:
- производительность
- Безопасность
Объект arguments не создается автоматически при каждом вызове функции, механизм JavaScript будет создавать его только по требованию, если он используется. И это творение не является бесплатным с точки зрения производительности. Разница между использованием аргументов и отсутствием использования может быть где-то между 1,5 и 4 раза медленнее, в зависимости от браузера
ясно, не могут ли быть правильными, так что это такое?
ECMA die-hard Дмитрий Сошников сказал:
Какой именно "движок JavaScript" имел ввиду? Откуда у вас это точное Информация? Хотя, это может быть правдой в некоторых (да, это хорошо оптимизации, так как вся необходимая информация о контекст доступен при разборе код, поэтому theres не нужно создавать аргумент объекта, если он не найден при разборе), но, как вы знаете ECMA-262-3, эти аргументы объект создается каждый раз на входящий в контекст выполнения.