上一节我们详细讲解了JS中函数参数的各种形式并简单提到过arguments类数组对象,本节我们将深入学习arguments类数组对象。
什么是类数组对象,类数组对象和数组有什么关系?
类数组对象(Array-like Object)是指具有数组某些特性但不是真正数组的对象。类数组对象是模仿数组行为的普通对象,它们有相似的使用接口,但没有数组的方法和特性。可以看作是数组的"简化版"或"兼容版"。
arguments对象是JS中的一个特殊对象,它包含了函数调用时传递给函数的所有参数。它可以在函数内部使用,用于访问和操作这些参数。
通过arguments类数组对象,我们可以调用JS函数的参数,并进行参数的遍历、长度打印以及单个元素通过下标访问。
/* arguments类数组对象 */
const obj ={brand:'Dotcpp编程',website:'dotcpp.com',content:'do coding',storage:99999999}//准备一个对象
function f(obj)
{
/* 打印参数长度 */
console.log(arguments.length);//这里打印1
/* 通过数组的方式访问对象属性 */
console.log(arguments[0].website);//dotcpp.com
/* 遍历 */
for(const arg of arguments)//这里会遍历整个对象
{
console.log(arg);
}
}
f(obj);
/*值得注意的是,箭头函数没有arguments类数组对象*/arguments对象与剩余参数:
在ES6之前,可以使用arguments对象来处理传递给函数的任意数量的参数。
在ES6及以后,更推荐使用剩余参数语法(...args)来接收多个参数,并将它们作为数组在函数内部使用。
如果我们需要打印参数,我们既可以通过arguments对象也可以通过剩余参数来实现:
/* 不推荐arguments类数组对象 */
function f1(a,b,c,d,e)
{
for( const args of arguments)console.log(args);
}
/*推荐剩余参数-rest是真数组*/
function f2(a,b,c,...rest)
{
console.log(a);
console.log(b);
console.log(c);
for(let i=0;i<rest.length;++i)console.log(rest[i]);
}
f1(1,2,3,4,5),f2(1,2,3,4,5);//f1、f2均可打印1,2,3,4,5下面我们通过表格来对比两者之间的关系:
| 特性 | f1 (arguments) | f2 (剩余参数) |
|---|---|---|
| 可读性 | 差,不知道参数结构 | 好,清晰看到参数划分 |
| 数组方法 | 需要转换才能使用 | 直接是数组,可直接使用 |
| 箭头函数 | 不可用 | 可用 |
| 类型安全 | 弱类型 | 强类型,明确参数 |
| 性能 | 需要类数组处理 | 直接数组操作 |
需要注意的是,arguments对象是一个类数组对象,它具有类似于数组的特性,但不是真正的数组。因此,它没有数组的方法和属性,如push、pop、length等。如果需要对参数进行数组操作,可以通过将arguments对象转换为真正的数组来实现,例如使用Array.from(arguments):
/*arguments->(转为)数组*/
function f(a,b,c,d,e)
{
const realArr=Array.from(arguments)
realArr.push(0)
console.log(realArr);
}
f(1,2,3,4,5);//f()可打印1,2,3,4,5, 0此外,需要注意的是在严格模式下,无法使用arguments.callee来引用当前函数自身,而在非严格模式下,可以使用arguments.callee来实现递归或动态调用函数自身的功能。因此,在现代的JavaScript开发中,推荐使用具名函数表达式或箭头函数来替代arguments.callee的使用。
总结:本节深入学习了JS函数中arguments类数组对象的相关知识,希望读者能够辨别arguments是类数组对象,而不要将其当作数组对待;同时要掌握arguments的基本操作(如遍历、长度或指定下标遍历单个元素)等,为将来JS的学习打下坚实的基础。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程