繁体   English   中英

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

[英]Why can't I call an array method on a function's arguments?

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

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

我想要一个所有参数的字符串传递给与/字符连接的函数。 我一直收到这个错误:

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

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

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运算符来执行函数调用,假设您有一个数组,并且您想要调用一个函数,将数组的每个元素作为函数调用的参数传递,现在您可以简单地:

 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) {
  // ...
}

并且扩展运算符的更多用途超出了这个问题的范围,例如对象复制,在数组中扩展数组等等......

如果您使用的是jQuery 1.2+ ,则可以使用$.makeArray()

将类似数组的对象转换为真正的JavaScript数组。

从问题中的示例,只需使用此行

var args = $.makeArray(arguments);

参数实际上不是一个数组。

试试这个:

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

问题是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是一个神奇的变量(它没有明确定义,所以它来自哪里?)
  • 在非严格模式下具有命名args的有趣行为 (注意你应该总是'use strict'
  • 第一个例子有更清晰的意图(所有参数的数组的创建都是explcit)。

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

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

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

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

您必须为变量赋值才能使其正常工作。

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

var myVar1 = a.join();

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

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

var myVar4 = a.join('');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM