Почему не делает .join (), работают с аргументами функции?

Почему делает эту работу (возвраты "один, два, три"):

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 () на нем?

68
задан John Feminella 19 January 2010 в 05:14
поделиться

6 ответов

Это не работает, потому что аргументы объект не является массивом, хотя он выглядит так. У него нет [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 (мой Любимый ресурс для такого рода вещей) должен сказать об этом:

Аргументы объект не является массивом. Это похоже на массив, но делает не имеют никаких свойств массива, кроме Длина . Например, у него нет метод поп. ...

Аргументы объект доступны только в зависимости от тела. Пытаться Доступ к объекту аргументов вне Функциональная декларация приводит к ошибка.

89
ответ дан 24 November 2019 в 14:17
поделиться
-

Если вы не заинтересованы в других Array.prototype Методы, и вы хотите просто использовать присоединиться , вы можете вызвать его напрямую , Без преобразования его на массив:

var displayIt = function() {
    return 'the list: ' + Array.prototype.join.call(arguments, ',');
};

Также вы можете найти полезное, чтобы узнать, что запятая является сепаратором по умолчанию, если вы не определяете разделитель, на SPEC будет использоваться запятая.

20
ответ дан 24 November 2019 в 14:17
поделиться

Аргументы не являются объектом jQuery, просто обычный объект JavaScript. Продлить его, прежде чем пытаться вызвать .join () . Я думаю, что вы бы написали:

return 'the list:' + $(arguments)[0];

(я не слишком знаком с jQuery, только прототипом, поэтому я надеюсь, что это не полностью поддельно.)

Редактировать: это неправильно! Но в своем ответе Даг Нинер описывает то, что я пытаюсь достичь.

0
ответ дан 24 November 2019 в 14:17
поделиться

Просто используйте функцию утилиты 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>
2
ответ дан 24 November 2019 в 14:17
поделиться

Я не знаю, есть ли простой способ преобразовать аргументы в массив, но вы можете попробовать это:

var toreturn = "the list:";
for(i = 0; i < arguments.length; i++)
{
   if(i != 0) { toreturn += ", "; }
   toreturn += arguments[i];
}
0
ответ дан 24 November 2019 в 14:17
поделиться
[1139473-

Вы можете использовать TypeOf, чтобы увидеть, что здесь происходит:

>>> typeof(['one', 'two', 'three'])
"object"
>>> typeof(['one', 'two', 'three'].join)
"function"
>>> typeof(arguments)
"object"
>>> typeof(arguments.join)
"undefined"

Здесь вы можете увидеть, что TypeOf возвращает «объект» в обоих случаях, но только один из объектов имеет функцию объединения. Отказ

1
ответ дан 24 November 2019 в 14:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: