js的argouments和rest参数,伪数组和数组,别再搞混淆了

71 阅读2分钟

要想知道二者有何不同,先了解一下这二者

rest参数
剩余参数的产生

正常情况下,我们写一个函数,他的 形参实参 是一一对应的,就比如

    function myfun(p1,p2){ //形参就是a和b
        return p1 + p2;
    }
    myfun(1,2);    //实参就是1和2

    
    那如果说,传递的实参个数大于形参呢?
   
    function myfun(p1,p2){ 
        return p1 + p2;
    }
    myfun(1,2,3,4);    

这个函数调用的时候传递了4个参数进去,但是声明函数的时候只定义了两个形参 p1p2,很明显,剩余的两个参数 就接收不到,被忽略掉了

所以,这就涉及到剩余参数收集的问题了。

rest 参数是一种语法,它允许我们将不定数量的参数表示为一个数组。在平常的开的中,特别是函数定义时,经常会遇到数量不确定的参数,这个时候我们可以使用三个点... 变量 来表示 rest 参数,那些暂时不确定的参数就会被收集到一个数组中。

举个例子 image.png

这就大大方便了我们收集剩余参数,而且这是一个数组,所以它就拥有数组的种种方法

arguments

argumentsjs 中的一个特殊对象,它包含了函数调用时传递的所有参数(获取的是“实参”)

image.png

arguments 对象可以在函数内部使用,用于访问函数的参数。它是一个类数组对象,可以通过下标访问每个参数。 image.png

如图所示,arguments[0] 表示第一个参数,arguments[1] 表示第二个参数,以此类推。arguments 对象还有一个 length 属性,表示传递给函数的参数个数。 image.png

需要注意的是,arguments 对象只在函数内部有效,函数外部无法访问,而且既然是 伪数组 ,也可以 通过下标访问元素 ,但并不是真正的数组对象,因此不能使用数组的所有方法。 image.png

区别
  • rest参数是用来收集剩余参数的,arguments 包含了函数调用时传递的所有参数
  • rest参数真.数组arguments 是 伪数组 ,能通过下标访问元素,但不能使用数组的方法
常见的伪数组

js 中 常见的伪数组除了 arguments 对象、DOM 元素集合、NodeList 对象等 image.png

image.png

伪数组变为真数组

伪数组是不能使用数组的方法的,有时候就很难受,那有没有办法可以将伪数组转变为真数组呢?

有的

  • Array.from():

      function fun(n1, n2, ...numbers) {
      return Array.from(arguments);
      }
    
      const arr = fun('张三', '李四', 1, 2, 3, 4);
      arr.push(666);
    

    image.png

  • 展开运算符...

      function fun(n1, n2, ...numbers) {
      return [...arguments];
      }
    
      const arr = fun('张三', '李四', 1, 2, 3, 4);
      arr.push(666)
    

image.png

拓展
  • 实参: 调用函数,传入的实际参数
  • 形参: 声明函数,占位用的参数