我有一个可以接受任意数量参数的函数......
const getSearchFields = () => {
const joined = arguments.join('/');
};
我想要一个所有参数的字符串传递给与/
字符连接的函数。我一直收到这个错误:
args.join不是函数
有人可以告诉我我做错了吗?
答案 0 :(得分:45)
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, "/");
答案 1 :(得分:14)
如上所述,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('/');
};
您也可以使用spread运算符来执行函数调用,假设您有一个数组,并且您想要调用一个函数,将数组的每个元素作为函数调用的参数传递,现在您可以简单地: / p>
function sum(a, b, c, d) {
return a + b + c + d;
}
var array = [1, 2, 3, 4];
console.log(sum(...array)); // 10
此外,你可以期待一些参数,并传递参数的 rest 作为最后参数定义:
function processList(first, ...rest) {
// ...
}
spread 运算符有更多用途超出了这个问题的范围,例如对象复制,在数组中传播数组等......
答案 2 :(得分:8)
如果您使用 jQuery 1.2 + ,则可以使用$.makeArray()
:
将类似数组的对象转换为真正的JavaScript数组。
从问题中的示例中,只需使用此行
var args = $.makeArray(arguments);
答案 3 :(得分:5)
参数实际上不是一个数组。
试试这个:
var args = [].splice.call(arguments,0);
var argsString = args.join('/');
答案 4 :(得分:2)
问题是arguments
是类似数组的对象(它有编号的属性映射到传递的参数和length
属性),但它实际上是不是数组。
在过去,您可以使用Array.prototype.slice.call(arguments)
(以及其他方法)将其变为真实数组。
但是,这些天我们有点幸运(当然,取决于您支持的平台)。你可以做......
const getSearchFields = (...args) => {
Array.isArray(args); // true
};
...或...
const getSearchFields = () => {
const args = Array.from(arguments);
Array.isArray(args); // true
};
第一个例子是首选,因为......
arguments
是一个神奇的变量(它没有明确定义,所以它来自何处?)'use strict'
)答案 5 :(得分:0)
arguments
不是JavaScript数组;它是一个没有join
方法的特殊对象。
答案 6 :(得分:-1)
如果您在angular4用户HttpHeaders中发布http请求时获得了。请检查以下答案。在使用HttpHeaders后,我的问题得到了解决。
this.headers = new HttpHeaders({ 'Authorization': token1, 'X-IBM-Client-Id': 'ddddddd' });
values.join is not a function in the file http.es5.js Angular 4
答案 7 :(得分:-2)
您必须为变量赋值才能使其正常工作。
var a = ['Wind', 'Rain', 'Fire'];
var myVar1 = a.join();
var myVar2 = a.join(', ');
var myVar3 = a.join(' + ');
var myVar4 = a.join('');