详细介绍js函数中的arguments

原文链接:https://blog.csdn.net/qq_45080742/article/details/107881958

arguments相当于一个“伪数组”

ECMAScript函数的参数和其他的语言还是有些不同的,他并不介意你传进来多少个参数,以及参数的数据类型;通俗的说,即使你在定义函数时,只设置了两个形参,那么在调用这个函数时,你给他传递一个、二个,或者是四个、五个他都能接收,之所以会这样是因为在ECMAScript中的参数内部是用一个数组来表示的,实际操作中,在函数体内是通过arguments对象来访问这个参数数组,从而获取传递给函数的每个参数;arguments对象只是与数组类似,但他并不是一个数组,可以把它叫做伪数组,你也可以把它叫做其他的都可以。

arguments的有趣之处

先看一个正常的例子

  function demo1(a){
             console.log(a);
   }
   demo1(2);

 

 

这里给函数传递一个实参2,所以会打印数字 2;如下:
详细介绍js函数中的arguments
然后我们打印下arguments[0],他的索引类似于数组,也就是第一个数据,如下:

 function demo1(a){
             console.log(a);
             console.log(arguments[0]);
            }
        demo1(2);

 

打印结果如下:
详细介绍js函数中的arguments
当我们传递的实参个数大于形参的个数时

  function demo1(a){
             console.log(a);
             console.log(arguments);
               console.log(arguments[2]);
            }
        demo1(2,3,4);

 

结果如下:
详细介绍js函数中的arguments

打印的结果说明,arguments的确能够接受到传递过来的所有数据,把他们都给装进了一个数组里,并且可以通过索引拿到相应的值,当然索引是从0开始的;
当我们手动分别给形参和形参对应的arguments赋值
给形参赋值

  function demo1(a){
             a=10;
             console.log(a);
             console.log(arguments[0]);
            }
        demo1(2,3,4);

详细介绍js函数中的arguments

给arguments赋值

  function demo1(a){
            arguments[0]=20;
             console.log(a);
             console.log(arguments[0]);
            }
        demo1(2,3,4);

详细介绍js函数中的arguments
从结果可以看出,当实参的个数大于等于形参的个数时,通过手动改变形参的值,arguments的值,不管改的是两者中的哪一个,都会影响对应双方的值;
当我们传递的实参个数小于形参的个数时

    function demo1(a,b){
             console.log(a);
             console.log(b);
             console.log(arguments[0]);
             console.log(arguments[1]);
            }
        demo1(2);

结果如下:
详细介绍js函数中的arguments
从结果来看,直接访问形参和访问伪数组对应的下标的值相同,这时我们会默认为他们访问的是同一个内存地址,实则不是;我们看下面的例子:

 function demo1(a,b){
             b=20;
             console.log(a);
             console.log(b);
             console.log(arguments[0]);
             console.log(arguments[1]);
            }
        demo1(2);

详细介绍js函数中的arguments
结果显示,当我们给b直接赋值的时候,打印的结果显示,arguments[1]的值依旧是undefined,b的值是20;为什么会这样呢?他们不是相照应吗?

结论

答案是他们的内存空间是独立的,他们的值会同步,而同步也是要分情况的;
当我们传递的实参个数大于形参的个数时,改变形参对应的值,arguments中也会更新,反之也是如此;当我们传递的实参个数小于形参的个数时,赋值的形参对应的值被改变,arguments中也会更新,反之也是如此;没有赋值的形参对应的值被改变,arguments对应的值并不会改变;因为arguments对象的大小是由传入的实参的个数决定的,并不是由定义的命名参数的个数决定的,没有传递值的形参将会自动被赋予undefined值,这就跟定义了变量但没有初始化一样。

上一篇:Java代码性能优化小技巧


下一篇:一起学Vuejs(三)----- export和export default的区别