原文鏈接: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值,這就跟定義了變量但沒有初始化一樣。