javascript 为什么我不能在函数的参数上调用数组方法?

k2fxgqgv  于 2023-02-28  发布在  Java
关注(0)|答案(8)|浏览(172)

我有一个函数可以接受任意数量的参数...

const getSearchFields = () => {        
    const joined = arguments.join('/'); 
};

我想得到一个字符串,其中包含传递给函数的所有参数,并使用/字符连接。我一直收到以下错误:
args.join不是函数
有人能告诉我我做错了什么吗?

eivnm1vs

eivnm1vs1#

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, "/");
ctzwtxfj

ctzwtxfj2#

如上所述,arguments对象实际上不是一个数组,但您可以直接应用数组函数,方法是访问Array.prototype并使用applycall执行它们以更改上下文:

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 操作符的用法超出了这个问题的范围,例如对象复制、在数组中扩展数组等。

ergxz8rk

ergxz8rk3#

如果您使用的是jQuery 1.2 +,则可以使用$.makeArray()
将类似数组的对象转换为真正的JavaScript数组。
从问题中的示例来看,只需使用以下行

var args = $.makeArray(arguments);
5jvtdoz2

5jvtdoz24#

arguments不是真正的数组。
试试这个:

var args = [].splice.call(arguments,0);
var argsString = args.join('/');
rbl8hiat

rbl8hiat5#

问题是arguments是一个类似数组的对象(它有Map到传递的参数的编号属性和一个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'
  • 第一个示例的意图要清楚得多(创建所有参数的数组是显式的)。
jdg4fx2g

jdg4fx2g6#

arguments不是JavaScript数组;它是一个特殊对象,没有join方法。

j9per5c4

j9per5c47#

如果你在angular4用户HttpHeaders中发布http请求时遇到问题,请检查下面的答案。使用HttpHeaders后,我的问题解决了。

this.headers  = new HttpHeaders({ 'Authorization': token1, 'X-IBM-Client-Id': 'ddddddd' });

values.join不是文件http.es5.js中的函数Angular 4

2eafrhcq

2eafrhcq8#

你必须给一个变量赋值,它才能工作.

var a = ['Wind', 'Rain', 'Fire'];

var myVar1 = a.join();

var myVar2 = a.join(', ');

var myVar3 = a.join(' + ');

var myVar4 = a.join('');

相关问题