arguments
называется объектом, подобным массиву. Как вы уже видели, вы можете получить доступ к его элементам по индексу, но у вас нет всех методов Array. Другими примерами Array-подобных объектов являются HTML-коллекции, возвращаемые getElementsByTagName () или getElementsByClassName (). jQuery, если вы когда-либо использовали его, также является объектом, похожим на массив. После запроса некоторых объектов DOM, проверьте получившийся объект jQuery с помощью Firebug на вкладке DOM, и вы поймете, что я имею в виду.
Вот мое решение проблемы Meebo:
function conc(){
if (arguments.length === 0)
return "";
else
return Array.prototype.slice.call(arguments).join(" ");
}
alert(conc("a", "b", "c"));
Array.prototype.slice.call(arguments)
- хороший прием для преобразования нашего arguments
в настоящий объект Array. В Firefox Array.slice.call(arguments)
будет достаточно, но он не будет работать в IE6 (по крайней мере), поэтому обычно используется предыдущая версия. Кроме того, этот прием не работает для коллекции, возвращаемой методами DOM API в IE6 (по крайней мере); это выдаст ошибку. Кстати, вместо call
можно было бы использовать apply
.
Небольшое объяснение об объектах, подобных массиву. В JavaScript вы можете использовать практически что угодно для именования членов объекта, и числа не являются исключением. Таким образом, вы можете сконструировать объект, который выглядит следующим образом, который является совершенно допустимым JavaScript:
var Foo = {
bar : function() {
alert('I am bar');
},
0 : function() {
alert('I am 1');
},
length : 1
}
Вышеуказанный объект является объектом, подобным массиву, по двум причинам:
- У него есть члены, имена которых являются числами, поэтому они похожи на индексы Array
- Он имеет свойство
length
, без которого вы не можете преобразовать объект в настоящий массив с помощью конструкции: Array.prototype.slice.call(Foo);
Объект arguments объекта Function во многом похож на объект Foo, только в том, что он имеет свое специальное назначение.