arguments
JavaScript中的对象是一个奇怪的疣-在大多数情况下它的行为就像一个数组,但实际上不是数组对象。因为它是真正的完全是另一回事,它没有从有用的功能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();
如您在链接中所读
rest参数语法允许我们将不确定数量的参数表示为数组。
如果您对...
语法感到好奇,它称为Spread Operator,您可以在此处阅读更多内容。
使用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
的slice
一个参数对象的功能,这将其转换成一个标准的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);
但是,我倾向于觉得以前的版本更明确,所以我更喜欢它。滥用数组字面量表示法会让人觉得很棘手,而且看起来很奇怪。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句