詳細介紹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;如下:
在這里插入圖片描述
然后我們打印下arguments[0],他的索引類似於數組,也就是第一個數據,如下:

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

 

打印結果如下:
在這里插入圖片描述
當我們傳遞的實參個數大於形參的個數時

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

 

結果如下:
在這里插入圖片描述

打印的結果說明,arguments的確能夠接受到傳遞過來的所有數據,把他們都給裝進了一個數組里,並且可以通過索引拿到相應的值,當然索引是從0開始的;
當我們手動分別給形參和形參對應的arguments賦值
給形參賦值

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

在這里插入圖片描述

給arguments賦值

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

在這里插入圖片描述
從結果可以看出,當實參的個數大於等於形參的個數時,通過手動改變形參的值,arguments的值,不管改的是兩者中的哪一個,都會影響對應雙方的值;
當我們傳遞的實參個數小於形參的個數時

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

結果如下:
在這里插入圖片描述
從結果來看,直接訪問形參和訪問偽數組對應的下標的值相同,這時我們會默認為他們訪問的是同一個內存地址,實則不是;我們看下面的例子:

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

在這里插入圖片描述
結果顯示,當我們給b直接賦值的時候,打印的結果顯示,arguments[1]的值依舊是undefined,b的值是20;為什么會這樣呢?他們不是相照應嗎?

結論

答案是他們的內存空間是獨立的,他們的值會同步,而同步也是要分情況的;
當我們傳遞的實參個數大於形參的個數時,改變形參對應的值,arguments中也會更新,反之也是如此;當我們傳遞的實參個數小於形參的個數時,賦值的形參對應的值被改變,arguments中也會更新,反之也是如此;沒有賦值的形參對應的值被改變,arguments對應的值並不會改變;因為arguments對象的大小是由傳入的實參的個數決定的,並不是由定義的命名參數的個數決定的,沒有傳遞值的形參將會自動被賦予undefined值,這就跟定義了變量但沒有初始化一樣。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM