想要改进这篇文章? 提供这个问题的详细答案,包括引文和解释为什么你的答案是正确的。没有足够细节的答案可能会被编辑或删除。
JavaScript 中的arguments对象是一个奇怪的缺陷——在大多数情况下,它的行为就像一个数组,但它 实际上并不是 一个数组对象。因为它完全是另外一回事,它没有Array.prototype像forEach, sort, filter, 和map.
arguments
Array.prototype
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 数组函数而不得不这样做是一件相当可怜的事情。有没有使用标准库的内置方法?
如果你能够使用 ES6,你可以使用:
休息参数
function sortArgs(...args) { return args.sort(function (a, b) { return a - b; }); } document.body.innerHTML = sortArgs(12, 4, 6, 8).toString();
正如您在链接中所读到的
剩余参数语法允许我们将不定数量的参数表示为一个数组。
如果您对语法感到好奇...,它被称为 扩展运算符,您可以 在此处阅读更多内容。
...
使用 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 实例。
Array.from
实际上,您可以在 arguments 对象上使用Array‘slice函数,它会将其转换为标准的 JavaScript 数组。您只需通过 Array 的原型手动引用它:
Array
slice
function sortArgs() { var args = Array.prototype.slice.call(arguments); return args.sort(); }
为什么这行得通?好吧,这是ECMAScript 5 文档本身的摘录:
注意 :该slice功能是故意通用的;它不要求它的 this 值是一个 Array 对象。因此,它可以转移到其他类型的对象中用作方法。函数能否slice成功应用于宿主对象取决于实现。
因此,slice适用于任何具有length属性的东西,这arguments很方便。
length
如果Array.prototype.slice对您来说太多了,您可以使用数组文字稍微缩写它:
Array.prototype.slice
var args = [].slice.call(arguments);
但是,我倾向于觉得前一个版本更明确,所以我更喜欢它。滥用数组字面量表示法让人感觉很笨拙,看起来很奇怪。