为什么. join()不使用函数参数?

为什么这样做(返回“1,2,3”) :

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 () ,我必须对我的“参数”变量做些什么?

43569 次浏览

arguments不是一个 jQuery 对象,只是一个普通的 JavaScript 对象。在尝试调用 .join()之前扩展它。我想你会写:

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

(我不太熟悉 jQuery,只熟悉 Prototype,所以我希望这不是完全伪造的。)

编辑: 这是错误的! 但是在道格 · 内内尔的回答中,他描述了我正在努力完成的事情。

它无法工作,因为 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 的 译自: 美国《科学》杂志网站(http://api.jquery.com/jQuery.makeArray/rel = “ norefrer”> makeArray ,它将尝试将“几乎-数组”(如 arguments)转换为数组:

var args = $.makeArray(arguments);

下面是 < a href = “ https://developer.Mozilla.org/En/Core _ JavaScript _ 1.5 _ Reference/function _ and _ function _ scope/Arguments”rel = “ noReferrer”> Mozilla reference (我最喜欢的这类资源)对它的评价:

arguments对象不是数组。 它类似于数组,但是确实如此 没有任何数组属性,除了 例如,它没有 流行的方法。

arguments对象仅可用 在一个函数体中 外部访问参数对象 函数声明的结果是 错误。

只需使用 jQuery 实用函数 makeArray

arguments不是 Array,而是一个对象。但是,由于它如此“类似于数组”,您可以调用 jQuery 实用函数 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>

您可以使用 typeof 查看这里发生了什么:

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

这里您可以看到 typeof 在两种情况下都返回“ object”,但是只有一个对象定义了连接函数。

如果您对其他 Array.prototype方法不感兴趣,并且只想使用 join,那么可以直接调用它,而不需要将其转换为数组:

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

另外,知道逗号是默认分隔符也是有用的,如果没有定义分隔符,那么到 规格时将使用逗号。

我不知道是否有一种简单的方法可以将参数转换成数组,但是你可以试试这个:

var toreturn = "the list:";
for(i = 0; i < arguments.length; i++)
{
if(i != 0) { toreturn += ", "; }
toreturn += arguments[i];
}

你可以用我做的这个 JQuery. join Obj 扩展/插件

正如你将在小提琴中看到的,你可以按照如下方式使用它:

$.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);

目前您不能联接数组参数,因为它们不是数组 这里显示

所以你要么先把它们变成这样的数组,

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

或者像这样,短一点

function displayIt() {
return 'the list: ' + [].join.call(arguments, ',');
}

如果您正在使用类似 Babel或兼容浏览器的东西来使用 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', ',');