# Псевдомассив аргументов "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
//+ run
var vasya = {
age: 21,
name: 'Вася',
surname: 'Петров'
};
var user = {
isAdmin: false,
isEmailConfirmed: true
};
var student = {
university: 'My university'
};
// добавить к vasya свойства из user и student
*!*
copy(vasya, user, student);
*/!*
alert(vasya.isAdmin); // false
alert(vasya.university); // My university
```
- Для создания копии объекта `user`:
```js
// скопирует все свойства в пустой объект
var userClone = copy({}, user);
```
Такой "клон" объекта может пригодиться там, где мы хотим изменять его свойства, при этом не трогая исходный объект `user`.
В нашей реализации мы будем копировать только свойства первого уровня, то есть вложенные объекты как-то особым образом не обрабатываются. Впрочем, её можно расширить.
А вот и реализация:
```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
}
```