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数组函数,就必须这么做,这是一件相当可怜的事情。是否有一种内置的方法来使用标准库?


当前回答

Lodash:

var args = _.toArray(arguments);

在行动:

(function(){ console.log(_.toArray(arguments).splice(1)); })(1, 2, 3)

生产:

[2,3]

其他回答

你可以创建一个可重用的函数来使用任何参数,最简单的是这样的:

function sortArgs() {
  return [...arguments].sort();
}

sortArgs('ali', 'reza', 1, 2, 'a'); //[1, 2, "a", "ali", "reza"];

扩展语法可以在ES6及以上版本中使用…

但是如果你想使用与ES5及以下版本兼容的东西,你可以使用Array.prototype.slice。调用,所以你的代码看起来像这样:

function sortArgs() {
  return Array.prototype.slice.call(arguments).sort();
}

sortArgs('ali', 'reza', 1, 2, 'a'); //[1, 2, "a", "ali", "reza"];

还有一些其他方法可以做到这一点,例如使用array. from或循环参数并将它们分配给一个新数组…

尽管rest参数工作得很好,但如果出于某种原因希望继续使用参数,请考虑

function sortArgs() {
  return [...arguments].sort()
}

[…arguments]可以被认为是Array.from(arguments)的一种替代方法,后者也能很好地工作。

ES7的一个替代方案是数组理解:

[for (i of arguments) i].sort()

如果你想在排序之前处理或过滤参数,这可能是最简单的:

[for (i of arguments) if (i % 2) Math.log(i)].sort()

函数sortArgs(…args) { 返回参数。排序(函数(a, b){返回a - b;}); } document.body.innerHTML = sortArgs(1,2,3,4).toString();

下面是将参数转换为数组的几个方法的基准测试。

对我来说,对于少量的争论,最好的解决办法是:

function sortArgs (){
  var q = [];
  for (var k = 0, l = arguments.length; k < l; k++){
    q[k] = arguments[k];
  }
  return q.sort();
}

其他情况:

function sortArgs (){ return Array.apply(null, arguments).sort(); }

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

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

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