JavaScript中的arguments对象是一个奇怪的东西——它在大多数情况下就像一个数组,但实际上它不是一个数组对象。因为它是完全不同的东西,它没有数组中的有用函数。比如forEach, sort, filter和map。

用简单的for循环从arguments对象构造一个新数组非常简单。例如,这个函数对它的参数进行排序:

function sortArgs() {
    var args = [];
    for (var i = 0; i < arguments.length; i++)
        args[i] = arguments[i];
    return args.sort();
}

然而,仅仅为了访问非常有用的JavaScript数组函数,就必须这么做,这是一件相当可怜的事情。是否有一种内置的方法来使用标准库?


当前回答

这里有一个简洁明了的解决方案:

函数argsToArray() { 返回Object.values(参数); } //使用实例 console.log ( argsToArray(1, 2, 3, 4, 5) .map(arg => arg*11) );

对象。values()将以数组的形式返回对象的值,由于arguments是一个对象,它本质上将参数转换为数组,从而为您提供数组的所有辅助函数,如map、forEach、filter等。

其他回答

尝试使用Object.setPrototypeOf()

解释:将参数的原型设置为Array.prototype

函数toArray() { 返回对象。Array.prototype setPrototypeOf(参数) } console.log (toArray(“abc”,123年,{def: 456}, [0, [7, [14]]]))


说明:取参数的每个索引,将item放入数组中对应的数组索引处。

也可以使用Array.prototype.map()

function toray () return键[]文件夹。电话(论据,(_,k,a) => a[k]) 的 控制台日志(toArray(“abc”,123,{def: 456} [0, [7], [14]])


说明:取参数的每个索引,将item放入数组中对应的数组索引处。

循环的. .

函数toArray() { Let arr = [];For (let prop of arguments) arr.push(prop);返回加勒比海盗 } console.log (toArray(“abc”,123年,{def: 456}, [0, [7, [14]]]))


或Object.create ()

说明:创建对象,将对象的属性设置为每个参数索引处的项;设置创建对象的原型为Array.prototype

函数toArray() { Var obj = {}; For (var prop in arguments) { Obj[道具]= { 价值:参数(道具) 可写:没错, 可列举的:真的, 可配置:真 } } 返回Object.create(数组。原型,obj); } console.log (toArray(“abc”,123年,{def: 456}, [0, [7, [14]]]))

我建议使用ECMAScript 6展开操作符,它将把尾随参数绑定到数组。有了这个解决方案,你不需要触及arguments对象,你的代码将被简化。这个解决方案的缺点是它不能在大多数浏览器上运行,所以你必须使用JS编译器,比如Babel。在底层,Babel使用for循环将参数转换为Array。

function sortArgs(...args) {
  return args.sort();
}

如果你不能使用ECMAScript 6,我建议你看看其他的答案,比如@Jonathan Fingland

function sortArgs() {
    var args = Array.prototype.slice.call(arguments);
    return args.sort();
}
function sortArgs(){ return [].slice.call(arguments).sort() }

// Returns the arguments object itself
function sortArgs(){ return [].sort.call(arguments) }

一些数组方法故意不要求目标对象是一个实际的数组。它们只要求目标具有名为length和indexes的属性(必须为零或更大的整数)。

[].sort.call({0:1, 1:0, length:2}) // => ({0:0, 1:1, length:2})

这里有一个简洁明了的解决方案:

函数argsToArray() { 返回Object.values(参数); } //使用实例 console.log ( argsToArray(1, 2, 3, 4, 5) .map(arg => arg*11) );

对象。values()将以数组的形式返回对象的值,由于arguments是一个对象,它本质上将参数转换为数组,从而为您提供数组的所有辅助函数,如map、forEach、filter等。

 function x(){
   var rest = [...arguments]; console.log(rest);return     
   rest.constructor;
 };
 x(1,2,3)

我尝试了简单的破坏技巧