上一节我们详细讲解了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的学习打下坚实的基础。

点赞(81)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)