我有一个函数可以接受任意数量的参数...
const getSearchFields = () => {
const joined = arguments.join('/');
};
我想要一个包含传递给函数的所有参数的字符串,并使用/
字符连接。我一直收到这个错误:
args.join不是一个函数
有人能告诉我我哪里做错了吗?
发布于 2009-09-15 01:44:42
arguments
是一个伪数组,而不是真正的数组。join
方法可用于数组。
你需要作弊:
var convertedArray = [];
for(var i = 0; i < arguments.length; ++i)
{
convertedArray.push(arguments[i]);
}
var argsString = convertedArray.join('/');
与其他帖子类似,您可以速记执行以下操作:
var argsString = Array.prototype.join.call(arguments, "/");
发布于 2009-09-15 01:47:34
如上所述,arguments对象并不是真正的数组,但是您可以通过访问Array.prototype并使用apply或call执行它们来更改上下文,从而直接应用数组函数:
var argsString = Array.prototype.join.call(arguments, '/');
编辑:由于大约9年前提出的原始问题被更新为使用ES6语法,我觉得现在有必要提供ES6答案,因为该语言提供了本机构造来处理这种情况。
ES6标准引入了扩展运算符,您可以很容易地使用该运算符将参数作为数组对象接收,例如:
function sum(...numbers) {
return numbers.reduce((sum, value) => sum + value);
}
console.log(sum(1,2,3,4)); // 10
适用于您的示例:
const getSearchFields = (...fields) => {
const joined = fields.join('/');
};
您还可以使用扩展运算符来执行函数调用,假设您有一个数组,并且您想调用一个函数,将该数组的每个元素作为函数调用的参数传递,现在您可以简单地:
function sum(a, b, c, d) {
return a + b + c + d;
}
var array = [1, 2, 3, 4];
console.log(sum(...array)); // 10
您还可以期待一些参数,并将其余参数作为定义的最后一个参数传递:
function processList(first, ...rest) {
// ...
}
还有更多的扩展运算符的用法超出了这个问题的范围,例如对象复制,在数组中扩展数组,等等。
发布于 2014-03-04 03:46:32
如果您使用的是jQuery 1.2+,则可以使用$.makeArray()
将类似数组的对象转换为真正的JavaScript数组。
从问题中的示例中,只需使用下面这行
var args = $.makeArray(arguments);
https://stackoverflow.com/questions/1424710
复制相似问题