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数组函数,就必须这么做,这是一件相当可怜的事情。是否有一种内置的方法来使用标准库?
function sortArgs(){ return [].slice.call(arguments).sort() }
// Returns the arguments object itself
function sortArgs(){ return [].sort.call(arguments) }
一些数组方法故意不要求目标对象是一个实际的数组。它们只要求目标具有名为length和indexes的属性(必须为零或更大的整数)。
[].sort.call({0:1, 1:0, length:2}) // => ({0:0, 1:1, length:2})
尽管rest参数工作得很好,但如果出于某种原因希望继续使用参数,请考虑
function sortArgs() {
return [...arguments].sort()
}
[…arguments]可以被认为是Array.from(arguments)的一种替代方法,后者也能很好地工作。
ES7的一个替代方案是数组理解:
[for (i of arguments) i].sort()
如果你想在排序之前处理或过滤参数,这可能是最简单的:
[for (i of arguments) if (i % 2) Math.log(i)].sort()