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

  • 回答 (1)
  • 关注 (0)
  • 查看 (47)

arguments在JavaScript中的对象是一个奇怪的疣 - 它在大多数情况下就像一个数组,但它实际上不是一个数组对象。因为它是真正的完全是另一回事,它没有从有用的功能Array.prototype类似forEach,sort,filter,和map。

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

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

然而,这仅仅是为了访问非常有用的JavaScript数组函数而必须做的一件相当可怜的事情。有使用标准库的内置方法吗?

楼主石乐志楼主石乐志提问于
MyLove回答于

实际上,你可以只使用Array的slice功能上的参数对象,这将其转换成一个标准的JavaScript数组。你只需要通过Array的原型手动引用它:

function sortArgs() {
    var args = Array.prototype.slice.call(arguments);
    return args.sort();
}

为什么这个工作?那么,下面是ECMAScript 5文档本身的摘录:

注:该slice功能是有意通用的; 它不要求它的这个值是一个Array对象。因此可以将其转换为其他类型的对象用作方法。slice函数是否可以成功应用于主机对象取决于实现。

因此,slice任何length有财产的东西都可以工作arguments。

如果Array.prototype.slice对你来说太过分了,可以使用数组文字稍微缩写一下:

var args = [].slice.call(arguments);

不过,我倾向于认为前一个版本更加明确,所以我更喜欢它。滥用数组文字符号感觉很乱,看起来很奇怪。

如果您可以使用ES6,则可以使用:

其余参数

function sortArgs(...args) {
  return args.sort(function (a, b) { return a - b; });
}
document.body.innerHTML = sortArgs(12, 4, 6, 8).toString();

扫码关注云+社区

领取腾讯云代金券