# Псевдомассив аргументов "arguments" В JavaScript любая функция может быть вызвана с произвольным количеством аргументов. [cut] Например: ```js //+ run function go(a,b) { alert("a="+a+", b="+b); } go(1); // a=1, b=undefined go(1,2); // a=1, b=2 go(1,2,3); // a=1, b=2, третий аргумент не вызовет ошибку ``` [smart header="В JavaScript нет \"перегрузки\" функций"] В некоторых языках программист может создать две функции с одинаковым именем, но разным набором аргументов, а при вызове интерпретатор сам выберет нужную: ```js function log(a) { ... } function log(a,b,c) { ... } *!* log(a); // вызовется первая функция log(a,b,c); // вызовется вторая функция */!* ``` Это называется "полиморфизмом функций" или "перегрузкой функций". В JavaScript ничего подобного нет. **Может быть только одна функция с именем `log`, которая вызывается с любыми аргументами.** А уже внутри она может посмотреть, с чем вызвана и по-разному отработать. В примере выше второе объявление `log` просто переопределит первое. [/smart] ## Доступ к "лишним" аргументам Как получить значения аргументов, которых нет в списке параметров? Доступ к ним осуществляется через "псевдо-массив" arguments. Он содержит список аргументов по номерам: `arguments[0]`, `arguments[1]`..., а также свойство `length`. Например, выведем список всех аргументов: ```js //+ run function sayHi() { for (var i=0; i
copy(dst, src1, src2...)
Копирует свойства из объектов `src1, src2,...` в объект `dst`. Возвращает получившийся объект.
Использование: А вот и реализация: ```js //+ autorun function copy() { var dst = arguments[0]; for (var i=1; i
  • Полный список аргументов, с которыми вызвана функция, доступен через `arguments`.
  • Это псевдомассив, то есть объект, который похож на массив, в нём есть нумерованные свойства и `length`, но методов массива у него нет.
  • В старом стандарте было свойство `arguments.callee` со ссылкой на текущую функцию, а также свойство `arguments.callee.caller`, содержащее ссылку на функцию, которая вызвала данную. Эти свойства устарели, при `use strict` обращение к ним приведёт к ошибке.
  • Для указания аргументов по умолчанию, в тех случаях, когда они заведомо не `false`, удобен оператор `||`.
  • В тех случаях, когда возможных аргументов много и, в особенности, когда большинство их имеют значения по умолчанию, вместо работы с `arguments` организуют передачу данных через объект, который как правило называют `options`. Возможен и гибридный подход, при котором первый аргумент обязателен, а второй -- `options`, который содержит всевозможные дополнительные параметры: ```js function showMessage(text, options) { // показать сообщение text, настройки показа указаны в options } ```