2010-01-19 70 views
62

为什么这项工作(返回 “一,二,三”):为什么.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>'); 

我有什么做的,我的“论据”的变量设置为使用就可以了。加入()?

+0

参见:http://stackoverflow.com/questions/1424710/why-is-my-join-on-a-javascript- array-failing – Shog9 2010-01-19 04:56:24

+0

我已经修改了我的答案,以考虑您更新的问题 - 具体来说,“我必须做些什么来完成此项工作?”部分。 – 2010-01-19 04:58:34

回答

80

它不起作用,因为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 reference(我最喜欢这样的事情的资源)有什么看法吧:

The arguments object is not an array. It is similar to an array, but does not have any array properties except length . For example, it does not have the pop method. ...

The arguments object is available only within a function body. Attempting to access the arguments object outside a function declaration results in an error.

+3

或'Array.join(arguments,“,”)'(比如'Array.forEach(arguments,func);') – Anonymous 2010-01-19 04:59:37

+0

当你的一个参数是一个对象时会发生什么? – user1876508 2013-08-04 23:16:44

+3

@匿名 TypeError:对象函数Array(){[native code]}没有方法'join' – drAlberT 2013-12-19 12:00:07

0

arguments不是一个jQuery对象,只是一个普通的JavaScript对象。在尝试拨打.join()之前将其扩展。我想,你可以这样写:

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

(我不是太熟悉的jQuery,只有样机,所以我希望这不完全是假的。)

编辑:这是错误的!但是在他的回应中,Doug Neiner描述了我想要完成的事情。

+2

这不太对; 'arguments'不是一个数组。相反,它是一个“类似数组的对象”。 – 2010-01-19 04:51:51

+0

正常的JS数组支持'join'。 – 2010-01-19 04:52:00

+0

如果参数不是数组,参数[0]和参数[1]怎么给我传递给函数的正确值? – 2010-01-19 04:53:54

2

只需使用jQuery的效用函数makeArray

arguments不是一个数组,它是一个对象。但是,因为它使“阵列状”,你可以调用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> 
1

您可以使用typeof运算来看看发生了什么在这里:

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

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

19

如果你不感兴趣的其他Array.prototype方法,并且要简单地使用join,你可以直接调用它,而无需将其转换为一个数组:

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

而且您可能会发现要知道有用逗号是默认分隔符,如果您未定义分隔符,则使用spec将使用逗号。

+0

+1这是最快和最安全的答案*如果你想要的只是调用连接而不是创建一个新的数组。调用仅用于连接的切片也会在连接处理类似数组的对象时分配内存。 – Ajax 2014-02-23 09:46:20

0

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

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

您可以使用此jQuery .joinObj Extension/Plugin我做了。

正如你在拨弄看到,你可以按如下方式使用它:

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

...为什么是-1?这是一个可以按照要求完成的工作插件? – SpYk3HH 2012-08-11 04:09:25

+3

我也讨厌它,当人们-1我的文章没有解释.. +1为你.. T^T – Kokizzu 2012-12-17 05:27:52

0

在那时你不能加入数组参数,因为它们不是阵列,shown here

,所以你必须要么第一把它们变成一个这样的数组,

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', ','); 
相关问题