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

ale*_*lex 23 javascript

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

const getSearchFields = () => {        
    const joined = arguments.join('/'); 
};
Run Code Online (Sandbox Code Playgroud)

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

args.join不是一个函数

有人可以告诉我我做错了什么吗?

Dav*_*res 47

arguments是一个伪阵列,而不是真正的阵列.该join方法适用于数组.

你需要作弊:

var convertedArray = [];

for(var i = 0; i < arguments.length; ++i)
{
 convertedArray.push(arguments[i]);
}

var argsString = convertedArray.join('/');
Run Code Online (Sandbox Code Playgroud)

与其他帖子类似,您可以做以下简写:

var argsString = Array.prototype.join.call(arguments, "/");
Run Code Online (Sandbox Code Playgroud)

  • 要将arguments对象转换为数组,您可以简单地:`var convertedArray = Array.prototype.slice.call(arguments);` (6认同)
  • @Russ:更短但不能在IE上工作,你应该直接调用Array.prototype.slice函数. (3认同)

CMS*_*CMS 14

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

var argsString = Array.prototype.join.call(arguments, '/');
Run Code Online (Sandbox Code Playgroud)

编辑:由于大约9年前提出的原始问题被更新为使用ES6语法,我觉得现在需要提供ES6答案,语言提供本机构造来处理这种情况.

ES6标准引入了扩展运算符,您可以轻松地将其作为数组对象接收参数,例如:

function sum(...numbers) {
  return numbers.reduce((sum, value) => sum + value);
}

console.log(sum(1,2,3,4)); // 10
Run Code Online (Sandbox Code Playgroud)

适用于您的示例:

const getSearchFields = (...fields) => {        
  const joined = fields.join('/'); 
};
Run Code Online (Sandbox Code Playgroud)

您也可以使用spread运算符来执行函数调用,假设您有一个数组,并且您想要调用一个函数,将数组的每个元素作为函数调用的参数传递,现在您可以简单地:

function sum(a, b, c, d) {
  return a + b + c + d;
}

var array = [1, 2, 3, 4];
console.log(sum(...array)); // 10
Run Code Online (Sandbox Code Playgroud)

您还可以期待一些参数,并将其余参数作为 最后一个参数定义:

function processList(first, ...rest) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

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

  • 不,我正在使用电话,不适用 (4认同)
  • ......修正,调用apply时可能需要这样.你正在使用电话.我的错. (2认同)

use*_*130 8

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

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

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

var args = $.makeArray(arguments);
Run Code Online (Sandbox Code Playgroud)


Rus*_*rry 5

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

试试这个:

var args = [].splice.call(arguments,0);
var argsString = args.join('/');
Run Code Online (Sandbox Code Playgroud)