我有一个函数可以接受任意数量的参数...
const getSearchFields = () => { const joined = arguments.join('/'); };
我想得到一个字符串,其中包含传递给函数的所有参数,并使用/字符连接。我一直收到以下错误:args.join不是函数有人能告诉我我做错了什么吗?
/
eivnm1vs1#
arguments是伪数组,不是真实的数组。join方法可用于数组。你需要作弊:
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, "/");
ctzwtxfj2#
如上所述,arguments对象实际上不是一个数组,但您可以直接应用数组函数,方法是访问Array.prototype并使用apply或call执行它们以更改上下文:
var argsString = Array.prototype.join.call(arguments, '/');
编辑:由于大约9年前提出的原始问题已更新为使用ES6语法,因此我觉得现在需要提供ES6答案,因为该语言提供了原生构造来处理这类情况。
ES6标准引入了 *spread运算符 *,您可以轻松地使用它来接收作为数组对象的参数,例如:
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运算符进行函数调用,假设您有一个数组,并且您想要调用一个函数,将数组的每个元素作为函数调用的参数传递,现在您只需:
function sum(a, b, c, d) { return a + b + c + d; } var array = [1, 2, 3, 4]; console.log(sum(...array)); // 10
此外,您还可以期望一些参数,并将 rest 参数作为定义的last参数传递:
function processList(first, ...rest) { // ... }
还有更多的 spread 操作符的用法超出了这个问题的范围,例如对象复制、在数组中扩展数组等。
ergxz8rk3#
如果您使用的是jQuery 1.2 +,则可以使用$.makeArray():将类似数组的对象转换为真正的JavaScript数组。从问题中的示例来看,只需使用以下行
$.makeArray()
var args = $.makeArray(arguments);
5jvtdoz24#
arguments不是真正的数组。试试这个:
var args = [].splice.call(arguments,0); var argsString = args.join('/');
rbl8hiat5#
问题是arguments是一个类似数组的对象(它有Map到传递的参数的编号属性和一个length属性),但它实际上不是数组。在过去,您可以使用Array.prototype.slice.call(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 };
首选第一个示例,因为...
'use strict'
jdg4fx2g6#
arguments不是JavaScript数组;它是一个特殊对象,没有join方法。
j9per5c47#
如果你在angular4用户HttpHeaders中发布http请求时遇到问题,请检查下面的答案。使用HttpHeaders后,我的问题解决了。
this.headers = new HttpHeaders({ 'Authorization': token1, 'X-IBM-Client-Id': 'ddddddd' });
values.join不是文件http.es5.js中的函数Angular 4
2eafrhcq8#
你必须给一个变量赋值,它才能工作.
var a = ['Wind', 'Rain', 'Fire']; var myVar1 = a.join(); var myVar2 = a.join(', '); var myVar3 = a.join(' + '); var myVar4 = a.join('');
8条答案
按热度按时间eivnm1vs1#
arguments
是伪数组,不是真实的数组。join
方法可用于数组。你需要作弊:
与其他帖子类似,您可以使用以下方法进行速记:
ctzwtxfj2#
如上所述,arguments对象实际上不是一个数组,但您可以直接应用数组函数,方法是访问Array.prototype并使用apply或call执行它们以更改上下文:
编辑:由于大约9年前提出的原始问题已更新为使用ES6语法,因此我觉得现在需要提供ES6答案,因为该语言提供了原生构造来处理这类情况。
ES6标准引入了 *spread运算符 *,您可以轻松地使用它来接收作为数组对象的参数,例如:
应用于您的示例:
您还可以使用spread运算符进行函数调用,假设您有一个数组,并且您想要调用一个函数,将数组的每个元素作为函数调用的参数传递,现在您只需:
此外,您还可以期望一些参数,并将 rest 参数作为定义的last参数传递:
还有更多的 spread 操作符的用法超出了这个问题的范围,例如对象复制、在数组中扩展数组等。
ergxz8rk3#
如果您使用的是jQuery 1.2 +,则可以使用
$.makeArray()
:将类似数组的对象转换为真正的JavaScript数组。
从问题中的示例来看,只需使用以下行
5jvtdoz24#
arguments不是真正的数组。
试试这个:
rbl8hiat5#
问题是
arguments
是一个类似数组的对象(它有Map到传递的参数的编号属性和一个length
属性),但它实际上不是数组。在过去,您可以使用
Array.prototype.slice.call(arguments)
(以及其他方法)将其转换为真实的数组。然而,我们现在有点幸运(当然取决于你支持的平台)。
或者...
首选第一个示例,因为...
arguments
是一个魔术变量(它没有显式定义,那么它是从哪里来的?)'use strict'
)jdg4fx2g6#
arguments
不是JavaScript数组;它是一个特殊对象,没有join
方法。j9per5c47#
如果你在angular4用户HttpHeaders中发布http请求时遇到问题,请检查下面的答案。使用HttpHeaders后,我的问题解决了。
values.join不是文件http.es5.js中的函数Angular 4
2eafrhcq8#
你必须给一个变量赋值,它才能工作.