Почему делает эту работу (возвраты "один, два, три"):
var words = ['one', 'two', 'three'];
$("#main").append('<p>' + words.join(", ") + '</p>');
и эта работа (возвращает "список: 111"):
var displayIt = function() {
return 'the list: ' + arguments[0];
}
$("#main").append('<p>' + displayIt('111', '222', '333') + '</p>');
но не это (возвращает пробел):
var displayIt = function() {
return 'the list: ' + arguments.join(",");
}
$("#main").append('<p>' + displayIt('111', '222', '333') + '</p>');
Что я должен сделать к своей переменной "аргументов", чтобы быть для использования .join () на нем?
Это не работает, потому что аргументы
объект не является массивом, хотя он выглядит так. У него нет [11256439]
Метод :
>>> var d = function() { return '[' + arguments.join(",") + ']'; }
>>> d("a", "b", "c")
TypeError: arguments.join is not a function
Для преобразования аргументы
к массиву, вы можете сделать:
var args = Array.prototype.slice.call(arguments);
Теперь присоединятся
будет работать:
>>> var d = function() {
var args = Array.prototype.slice.call(arguments);
return '[' + args.join(",") + ']';
}
>>> d("a", "b", "c");
"[a,b,c]"
, Вы можете использовать jQuery's Makearray
, который постарается повернуть «почти-массивы», как аргументы
в массивах в массивы:
var args = $.makeArray(arguments);
вот что ссылка Mozilla (мой Любимый ресурс для такого рода вещей) должен сказать об этом:
Аргументы
объект не является массивом. Это похоже на массив, но делает не имеют никаких свойств массива, кроме
Длина
. Например, у него нет метод поп. ...Аргументы
объект доступны только в зависимости от тела. Пытаться Доступ к объекту аргументов вне Функциональная декларация приводит к ошибка.
Если вы не заинтересованы в других Array.prototype
Методы, и вы хотите просто использовать присоединиться
, вы можете вызвать его напрямую , Без преобразования его на массив:
var displayIt = function() {
return 'the list: ' + Array.prototype.join.call(arguments, ',');
};
Также вы можете найти полезное, чтобы узнать, что запятая является сепаратором по умолчанию, если вы не определяете разделитель, на SPEC будет использоваться запятая.
Аргументы
не являются объектом jQuery, просто обычный объект JavaScript. Продлить его, прежде чем пытаться вызвать .join ()
. Я думаю, что вы бы написали:
return 'the list:' + $(arguments)[0];
(я не слишком знаком с jQuery, только прототипом, поэтому я надеюсь, что это не полностью поддельно.)
Редактировать: это неправильно! Но в своем ответе Даг Нинер описывает то, что я пытаюсь достичь.
Просто используйте функцию утилиты jQuery Makearray
аргументы
не является массивом, это объект. Но, так как это так «подобно массивному», вы можете позвонить в функцию jQuery Utility Makearray
, чтобы сделать его работать:
var displayIt = function() {
return 'the list: ' + $.makeArray(arguments).join(",");
}
$("#main").append('<p>' + displayIt('111', '222', '333') + '</p>');
, который выводят:
<p>the list: 111,222,333</p>
Я не знаю, есть ли простой способ преобразовать аргументы в массив, но вы можете попробовать это:
var toreturn = "the list:";
for(i = 0; i < arguments.length; i++)
{
if(i != 0) { toreturn += ", "; }
toreturn += arguments[i];
}
Вы можете использовать TypeOf, чтобы увидеть, что здесь происходит:
>>> typeof(['one', 'two', 'three'])
"object"
>>> typeof(['one', 'two', 'three'].join)
"function"
>>> typeof(arguments)
"object"
>>> typeof(arguments.join)
"undefined"
Здесь вы можете увидеть, что TypeOf возвращает «объект» в обоих случаях, но только один из объектов имеет функцию объединения. Отказ