小编典典

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

all

想要改进这篇文章? 提供这个问题的详细答案,包括引文和解释为什么你的答案是正确的。没有足够细节的答案可能会被编辑或删除。

JavaScript 中的arguments对象是一个奇怪的缺陷——在大多数情况下,它的行为就像一个数组,但它 实际上并不是
一个数组对象。因为它完全是另外一回事,它没有Array.prototypeforEach,
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 数组函数而不得不这样做是一件相当可怜的事情。有没有使用标准库的内置方法?


阅读 110

收藏
2022-03-16

共1个答案

小编典典

ES6 使用剩余参数

如果你能够使用 ES6,你可以使用:

休息参数

function sortArgs(...args) {

  return args.sort(function (a, b) { return a - b; });

}



document.body.innerHTML = sortArgs(12, 4, 6, 8).toString();

正如您在链接中所读到的

剩余参数语法允许我们将不定数量的参数表示为一个数组。

如果您对语法感到好奇...,它被称为 扩展运算符,您可以 在此处阅读更多内容。

ES6 使用 Array.from()

使用 Array.from

function sortArgs() {

  return Array.from(arguments).sort(function (a, b) { return a - b; });

}



document.body.innerHTML = sortArgs(12, 4, 6, 8).toString();

Array.from只需将类 Array 或 Iterable 对象转换为 Array 实例。



ES5

实际上,您可以在 arguments 对象上使用Arrayslice函数,它会将其转换为标准的
JavaScript 数组。您只需通过 Array 的原型手动引用它:

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

为什么这行得通?好吧,这是ECMAScript 5 文档本身的摘录:

注意 :该slice功能是故意通用的;它不要求它的 this 值是一个 Array
对象。因此,它可以转移到其他类型的对象中用作方法。函数能否slice成功应用于宿主对象取决于实现。

因此,slice适用于任何具有length属性的东西,这arguments很方便。


如果Array.prototype.slice对您来说太多了,您可以使用数组文字稍微缩写它:

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

但是,我倾向于觉得前一个版本更明确,所以我更喜欢它。滥用数组字面量表示法让人感觉很笨拙,看起来很奇怪。

2022-03-16