ECMAScript標準中,每一個函數都有一個特殊的內置對象arguments。arguments對象是一個類Array對象(object),用以保存函數接收到的實參副本。 javascript
1、內置特性 java
說它是一個內置對象是由於咱們在建立函數時並無定義這個對象: 數組
var funcTest =function(args){ console.log(arguments); } funcTest('a'); //{'a'} console.log(funcTest.arguments);
直接調用funcTest.arguments輸出的結果是null,這一點更能夠說明arguments的內置性,當函數開始執行時才能調用到該對象。 函數
2、arguments保存的是函數的實參副本 spa
在聲明一個函數時,函數內部會開闢內存空間用以存儲形式參數的變量(指針),這一過程是在定義函數時完成的;而arguments是依據傳入的實參而開闢內存空間用以存儲實參副本,這一過程是在調用函數時發生的。二者並無在同一內存空間中存儲變量的值。 prototype
1,當實參數量等於形參數量時,二者中的值是同步的: 指針
function funcTest(a,b){ alert(a); //1 alert(arguments[0]); //1 a='11'; alert(a); //11 alert(arguments[0]); //11 arguments[0]='22'; alert(a) //22 } funcTest('1','2');
2,有時它們的值並不一樣步: code
function funcTest(a,b,c){ alert(arguments[0]); //1 alert(c); //undefined c='3'; alert(arguments[2]); //undefined } funcTest('1','2');
arguments對象根據傳入的實參順序來與實參的值進行同步,若是該順序(index)中沒有傳入實參則不一樣步。 對象
3,僅僅是保存實參的副本: 遞歸
function funcTest(a,b){ alert(arguments[2]) //undefined arguments[2]="1"; alert(arguments[2]); //undefined } funcTest('1','2');
在使用arguments對象時, 在函數內部並不能經過使用arguments[n]的形式來開闢新的內存空間用以保存變量的值,也不能經過該方法增長arguments中的變量數。arguments在函數被調用後即開闢內存空間,該空間數目依據實參數量而來,不可更改。
3、arguments的屬性
1,length屬性
arguments.length返回對象中存儲的變量的長度
2,callee 方法
arguments.callee返回函數自身的引用
var funcTest=function(){ alert(funcTest===arguments.callee); //true }
arguments.callee指向函數自身的引用,這在使用匿名函數時會比較有用。
咱們能夠利用arguments.callee來建立一個遞歸函數:
function funcTest(n){ if(n<=1){ return 1; }else{ return n*arguments.callee(--n); } }
也能夠用來判斷參數數目:
function funcTest(a,b){ if(arguments.length!=arguments.callee.length){ alert('傳入的參數數目不足!'); } }
4、將arguments對象轉換成數組(Array)
開篇語裏提到arguments對象是一個類數組對象,是由於它有一些特性和數組很類似,好比有length的屬性和相似數組的索引器訪問內部變量的特性。但實際上它並非一個真正的數組。咱們能夠經過下面的方式將它轉換成一個真正的數組:
var arr=Array.prototype.slice.call(arguments);