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使用rest参数

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

100

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

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

就像你可以在link里读到的

rest参数语法允许我们将不确定数量的参数表示为一个array.

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

ES6使用array.from()

使用100:

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

实际上,您只需在Arguments对象上使用Arrayslice函数,它就会将其转换为标准的JavaScriptarray.您只需通过Array的原型手动引用它:

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

为什么会这样?下面是ECMAScript 5 documentation itself人名单的一个节选:

NOTE:slice函数是有意通用的;它不要求其this值是数组对象.因此,它可以被转移到其他类型的对象中用作一种方法.slice函数能否成功应用于主机对象取决于实现.

因此,slice适用于任何具有length属性的对象,而arguments可以方便地使用.


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

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

然而,我倾向于认为前一个版本更明确,所以我更喜欢它.滥用数组文字符号会让人感觉不舒服,而且看起来很奇怪.

Javascript相关问答推荐

为什么使用MAX_SAFE_INTEGER生成随机整数时数字分布不准确?

fs. writeFile()vs fs.writeFile()vs fs.appendFile()

如何修复我的js构建表每当我添加一个额外的列作为它的第一列?

WebRTC关闭navigator. getUserMedia正确

在nextjs服务器端api调用中传递认证凭证

如何在bslib nav_insert之后更改导航标签的CSS类和样式?

如何从网站www.example.com获取表与Cheerio谷歌应用程序脚本

如何在Angular17 APP中全局设置AXIOS

material UI按钮组样式props 不反射

JQuery Click事件不适用于动态创建的按钮

使用带有HostBinding的Angular 信号来更新样式?

在VS代码上一次设置多个变量格式

与svg相反;S getPointAtLength(D)-我想要getLengthAtPoint(x,y)

如何使本地html页面在重新加载时保持当前可隐藏部分的打开状态?

图表4-堆叠线和条形图之间的填充区域

JavaScript将字符串数字转换为整数

为什么我的Navbar.css没有显示在本地主机页面上?

在ChartJS中使用spanGaps时,是否获取空值的坐标?

$GTE的mongoose 问题

将字符串解释为数字;将其重新编码为另一个基数