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数组函数,就必须这么做,这是一件相当可怜的事情。是否有一种内置的方法来使用标准库?
在ECMAScript 6中,不需要使用像Array.prototype.slice()这样丑陋的hack。您可以使用扩展语法(…)。
(函数(){
console.log(参数[…]);
}(1,2,3))
这看起来可能很奇怪,但其实相当简单。它只是提取参数的元素并将它们放回数组。如果你还是不明白,请看下面的例子:
console.log([1, ...[2, 3], 4]);
console.log([...[1, 2, 3]]);
console.log([...[...[...[1]]]]);
注意,它在一些较老的浏览器(如IE 11)中不起作用,所以如果你想支持这些浏览器,你应该使用Babel。
我建议使用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();
}
在ECMAScript 6中,不需要使用像Array.prototype.slice()这样丑陋的hack。您可以使用扩展语法(…)。
(函数(){
console.log(参数[…]);
}(1,2,3))
这看起来可能很奇怪,但其实相当简单。它只是提取参数的元素并将它们放回数组。如果你还是不明白,请看下面的例子:
console.log([1, ...[2, 3], 4]);
console.log([...[1, 2, 3]]);
console.log([...[...[...[1]]]]);
注意,它在一些较老的浏览器(如IE 11)中不起作用,所以如果你想支持这些浏览器,你应该使用Babel。