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]

其他回答

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

同样值得参考的是这个Bluebird承诺库wiki页面,它展示了如何以一种使函数在V8 JavaScript引擎下可优化的方式管理参数对象到数组:

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

此方法用于支持var args = [].slice.call(arguments);。作者还展示了构建步骤如何帮助减少冗余。

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

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

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(); }
function sortArg(){
var args = Array.from(arguments); return args.sort();
}

函数sortArg () ( 瓦尔·阿格斯=阵列。 重返args sort (); ) ”,类游戏机。log (sortArg(20、1、2、目标、88、’19’、39、’d’’z’’ak’’bu’、90);

我建议使用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();
}