Почему.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>');
что мне нужно сделать с моей переменной "аргументы", чтобы использовать .присоединяйтесь () к нему?
8 ответов:
он не работает, потому что
argumentsобъект не является массивом, хотя и выглядит так. У него нетjoinспособ:>>> var d = function() { return '[' + arguments.join(",") + ']'; } >>> d("a", "b", "c") TypeError: arguments.join is not a functionпреобразование
argumentsк массиву, вы можете сделать:var args = Array.prototype.slice.call(arguments);теперь
joinсовместимость:>>> var d = function() { var args = Array.prototype.slice.call(arguments); return '[' + args.join(",") + ']'; } >>> d("a", "b", "c"); "[a,b,c]"кроме того, вы можете использовать jQuery
makeArray, который будет пытаться превратить "почти массивы", какargumentsв массивы:var args = $.makeArray(arguments);вот что ссылка на Mozilla (мой любимый ресурс для такого рода вещи) говорит об этом:
The
argumentsобъект не является массивом. Он похож на массив, но не не имеют никаких свойств массива, кромеlength. Например, он не имеет метод pop. ...The
argumentsобъект доступен только внутри тела функции. Попытка доступ к аргументам объект вне объявление функции результаты в ошибка.
Если вы не заинтересованы в другие
Array.prototypeметодами, и вы хотите просто использоватьjoin, вы можете вызвать его напрямую, не преобразуя его в массив:var displayIt = function() { return 'the list: ' + Array.prototype.join.call(arguments, ','); };также вы можете найти полезным знать, что запятая является разделителем по умолчанию, если вы не определяете разделитель, по spec запятая будет использоваться.
просто используйте функцию утилиты jQuery
makeArray
arguments- это не массив, это объект. Но, поскольку он так "массивов", вы можете позвонить служебная функция в jQuerymakeArrayчтобы заставить его работать:var displayIt = function() { return 'the list: ' + $.makeArray(arguments).join(","); } $("#main").append('<p>' + displayIt('111', '222', '333') + '</p>');что будет на выходе:
<p>the list: 111,222,333</p>
вы могли бы использовать это jQuery .joinObj расширение / плагин Я сделал.
как вы увидите в этой скрипке, вы можете использовать его следующим образом:
$.joinObj(args, ",");или
$.(args).joinObj(",");
Код Плагина:
(function(c){c.joinObj||(c.extend({joinObj:function(a,d){var b="";if("string"===typeof d)for(x in a)switch(typeof a[x]){case "function":break;case "object":var e=c.joinObj(a[x],d);e!=__proto__&&(b+=""!=b?d+e:e);break;default:"selector"!=x&&"context"!=x&&"length"!=x&&"jquery"!=x&&(b+=""!=b?d+a[x]:a[x])}return b}}),c.fn.extend({joinObj:function(a){return"object"===typeof this&&"string"===typeof a?c.joinObj(this,a):c(this)}}))})(jQuery);
вы можете использовать typeof, чтобы увидеть, что происходит здесь:
>>> typeof(['one', 'two', 'three']) "object" >>> typeof(['one', 'two', 'three'].join) "function" >>> typeof(arguments) "object" >>> typeof(arguments.join) "undefined"здесь вы можете видеть, что typeof возвращает "объект" в обоих случаях, но только один из объектов имеет определенную функцию соединения.
arguments- это не объект jQuery, а обычный объект JavaScript. Расширьте его, прежде чем пытаться позвонить.join(). Я думаю, вы бы написали:return 'the list:' + $(arguments)[0];(Я не слишком знаком с jQuery, только прототип, поэтому я надеюсь, что это не совсем фиктивно.)
Edit: это неправильно! Но в своем ответе Дуг найнер описывает то, что я пытаюсь сделать.
Я не знаю, есть ли простой способ преобразования аргументов в массив, но вы можете попробовать это:
var toreturn = "the list:"; for(i = 0; i < arguments.length; i++) { if(i != 0) { toreturn += ", "; } toreturn += arguments[i]; }
на данный момент Вы не можете присоединиться к аргументам массива, потому что они не являются массивом, показано здесь
так что вы должны либо сначала превратить их в массив, как это,
function f() { var args = Array.prototype.slice.call(arguments, f.length); return 'the list: ' + args.join(','); }или вот так, немного короче
function displayIt() { return 'the list: ' + [].join.call(arguments, ','); }если вы используете что-то вроде Бабель или совместимый браузер для использования функций es6, вы также можете сделать это с помощью аргументов rest.
function displayIt(...args) { return 'the list: ' + args.join(','); } displayIt('111', '222', '333');что позволит вам делать еще более крутые вещи как
function displayIt(start, glue, ...args) { return start + args.join(glue); } displayIt('the start: ', '111', '222', '333', ',');