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

你说的曾经没有我的故事 提交于 2020-02-26 07:00:31
想要改善这篇文章吗? 提供此问题的详细答案,包括引文和为什么答案正确的解释。 答案不够详细的答案可能会被编辑或删除。

JavaScript中的arguments对象是一个奇怪的疣-在大多数情况下它的行为就像一个数组,但实际上不是数组对象。 由于它实际上完全是另外一回事 ,因此它没有Array.prototype有用的功能,例如forEachsortfiltermap

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

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

但是,仅获得访问极其有用的JavaScript数组函数所要做的事情是相当可怜的。 是否有使用标准库的内置方法?


#1楼

这是一个非常老的问题,但是我认为我有一个比以前的解决方案更易于键入并且不依赖外部库的解决方案:

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

#2楼

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

对我来说,少量参数的最佳解决方案是:

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楼

采用:

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

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

Array(str1)返回[str1]

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都可以。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!