如何在JavaScript中将“参数”对象转换为数组?

想要改善这篇文章吗? 提供此问题的详细答案,包括引文和为何答案正确的解释。 答案不够详细的答案可能会被编辑或删除。

JavaScript中的arguments对象是一个奇怪的疣-在大多数状况下它的行为就像一个数组,但实际上不是数组对象。 因为它实际上彻底是另一回事 ,所以它没有Array.prototype有用的功能,例如forEachsortfiltermapgit

使用一个简单的for循环从arguments对象构造新数组很是容易。 例如,此函数对其参数进行排序: github

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

可是,仅得到访问极其有用的JavaScript数组函数所要作的事情是至关可怜的。 是否有使用标准库的内置方法? 数组


#1楼

这是一个很是老的问题,可是我认为我有一个比之前的解决方案更易于键入而且不依赖外部库的解决方案: app

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

#2楼

这是将参数转换为数组的几种方法的基准jsp

对我来讲,少许参数的最佳解决方案是: 函数

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(); }

#3楼

采用: spa

function sortArguments() {
  return arguments.length === 1 ? [arguments[0]] :
                 Array.apply(null, arguments).sort();
}

Array(arg1, arg2, ...)返回[arg1, arg2, ...] prototype

Array(str1)返回[str1] code

Array(num1)返回具备num1元素的数组

您必须检查参数数量!

Array.slice版本(较慢):

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

Array.push版本(慢于切片):

function sortArguments() {
  var args = [];
  Array.prototype.push.apply(args, arguments);
  return args.sort();
}

移动版本(速度较慢,但​​尺寸较小则更快):

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

Array.concat版本(最慢):

function sortArguments() {
  return Array.prototype.concat.apply([], arguments).sort();
}

#4楼

还值得参考这个Bluebird Promise库Wiki页面 ,该页面显示了如何以使函数在V8 JavaScript引擎下可优化的方式将arguments对象管理为数组:

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); 。 做者还展现了构建步骤如何帮助减小冗长程度。


#5楼

另外一个答案。

使用黑魔法:

function sortArguments() {
  arguments.__proto__ = Array.prototype;
  return arguments.slice().sort();
}

Firefox,Chrome,Node.js,IE11均可以。

相关文章
相关标签/搜索