JavaScript中的arguments
对象是一个奇怪的疣-在大多数状况下它的行为就像一个数组,但实际上不是数组对象。 因为它实际上彻底是另一回事 ,所以它没有Array.prototype
有用的功能,例如forEach
, sort
, filter
和map
。 git
使用一个简单的for循环从arguments对象构造新数组很是容易。 例如,此函数对其参数进行排序: github
function sortArgs() { var args = []; for (var i = 0; i < arguments.length; i++) args[i] = arguments[i]; return args.sort(); }
可是,仅得到访问极其有用的JavaScript数组函数所要作的事情是至关可怜的。 是否有使用标准库的内置方法? 数组
这是一个很是老的问题,可是我认为我有一个比之前的解决方案更易于键入而且不依赖外部库的解决方案: app
function sortArguments() { return Array.apply(null, arguments).sort(); }
对我来讲,少许参数的最佳解决方案是: 函数
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(); }
采用: 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(); }
还值得参考这个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);
。 做者还展现了构建步骤如何帮助减小冗长程度。
另外一个答案。
使用黑魔法:
function sortArguments() { arguments.__proto__ = Array.prototype; return arguments.slice().sort(); }
Firefox,Chrome,Node.js,IE11均可以。