В JavaScript любая функция может быть вызвана с произвольным количеством аргументов. Например:
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, третий аргумент не вызовет ошибку
Доступ к «лишним» аргументам
Как получить значения аргументов, которых нет в списке параметров? Доступ к ним осуществляется через «псевдо‑массив» arguments .
Он содержит список аргументов по номерам: arguments[0] , arguments[1] …, а также свойство length . Например, выведем список всех аргументов:
function sayHi() {
for (var i = 0; i < arguments.length; i++) { alert( "Привет, " + arguments[i] );
}
}
sayHi("Винни", "Пятачок"); // 'Привет, Винни', 'Привет, Пятачок'
Все параметры находятся в arguments , даже если они есть в списке. Код выше сработал бы также, будь функция объявлена sayHi(a,b,c) .
arguments – это не массив
Частая ошибка новичков – попытка применить методы Array к arguments . Это невозможно:
function sayHi() {
var a = arguments.shift(); // ошибка! нет такого метода!
}
sayHi(1);
Дело в том, что arguments – это не массив Array .
В действительности, это обычный объект, просто ключи числовые и есть length . На этом сходство заканчивается. Никаких особых методов у него нет, и методы массивов он тоже не поддерживает.
Впрочем, никто не мешает сделать обычный массив из arguments , например так:
var args = [];
for (var i = 0; i < arguments.length; i++) { args[i] = arguments[i];
}
Такие объекты иногда называют «коллекциями» или «псевдомассивами».
Пример: копирование свойств copy(dst, src1, src2...)
Иногда встаёт задача – скопировать в существующий объект свойства из одного или нескольких других.
Напишем для этого функцию copy . Она будет работать с любым числом аргументов, благодаря использованию arguments . Синтаксис:
copy(dst, src1, src2…)
Копирует свойства из объектов src1, src2,... в объект dst . Возвращает получившийся объект. Использование:
Для объединения нескольких объектов в один:
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 :
// скопирует все свойства в пустой объект var userClone = copy({}, user);
Такой «клон» объекта может пригодиться там, где мы хотим изменять его свойства, при этом не трогая исходный объект user .
В нашей реализации мы будем копировать только свойства первого уровня, то есть вложенные объекты как‑то особым образом не обрабатываются. Впрочем, её можно расширить.
А вот и реализация:
function copy() {
var dst = arguments[0];
for (var i = 1; i < arguments.length; i++) { var arg = arguments[i];
for (var key in arg) { dst[key] = arg[key];
}
}
return dst;
}
Здесь первый аргумент copy – это объект, в который нужно копировать, он назван dst . Для упрощения доступа к нему можно указать его прямо в объявлении функции:
function copy(dst) {
// остальные аргументы остаются безымянными for (var i = 1; i < arguments.length; i++) {
var arg = arguments[i]; for (var key in arg) { dst[key] = arg[key];
}
}
return dst;
}
Do'stlaringiz bilan baham: |