JavaScript中的arguments
对象是一个奇怪的疣-在大多数情况下它的行为就像一个数组,但实际上不是数组对象。 由于它实际上完全是另外一回事 ,因此它没有Array.prototype
有用的功能,例如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数组函数所要做的事情是相当可怜的。 是否有使用标准库的内置方法?
#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都可以。
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3162080