gpt4 book ai didi

javascript - 如何将 "arguments"对象转换为 JavaScript 中的数组?

转载 作者:IT老高 更新时间:2023-10-28 11:01:36 27 4
gpt4 key购买 nike

JavaScript 中的 arguments 对象是一个奇怪的缺陷——在大多数情况下它就像一个数组,但它实际上不是一个数组对象。因为它是 really something else entirely , 它没有 Array.prototype 中的有用功能如 forEachsortfiltermap

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

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

然而,仅仅为了访问极其有用的 JavaScript 数组函数而不得不这样做是一件相当可怜的事情。有没有使用标准库的内置方法?

最佳答案

ES6 使用剩余参数

如果你会使用 ES6,你可以使用:

Rest Parameters

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

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

正如您在 link 中所读到的那样

The rest parameter syntax allows us to represent an indefinite number of arguments as an array.

如果您对 ... 语法感到好奇,它被称为 Spread Operator,您可以阅读更多 here .

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 简单地将类数组或可迭代对象转换为数组实例。



ES5

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

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

为什么会这样?好吧,这是 ECMAScript 5 documentation itself 的摘录:

NOTE: The slice function is intentionally generic; it does not require that its this value be an Array object. Therefore it can be transferred to other kinds of objects for use as a method. Whether the slice function can be applied successfully to a host object is implementation-dependent.

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


如果 Array.prototype.slice 对你来说太多了,你可以用数组字面量稍微缩写一下:

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

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

关于javascript - 如何将 "arguments"对象转换为 JavaScript 中的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/960866/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com