初學js的時候,對arguments這個東西常見,就是搞不清他的意思~ 下面是我找到的一些資料和個人理解,終於弄懂了這個傢伙javascript
首先arguments指向實參對象java
在函數體內,標識符arguments是指向實參對象的引用,實參對象是一個類數組對象 arguments[0],arguments.length,類數組不是數組,雖然也有數組的前面這兩種屬性,具體判斷可使用instanceof來判斷一下數組
instanceof 用於判斷一個實例是不是某種類型
在 typeof 方法返回 「object」 的狀況下,instanceof 方法仍是頗有用的。
arrayLike instanceof Array
// false
其值是布爾值那麼問題來了
arguments是什麼?
1. arguments是收到的實參副本
在詞法分析中, 首先按形參造成AO的屬性,值爲undefined
當實參傳來時, 再修改AO的相應屬性.
2:並把全部收到實參收集起來,放到一個arguments對象裏
function t(a,b,c){},
調用時: t(1,2,3,4,5) 5個參數,這裏傳入了5個參數
此時 , AO屬性只有a,bc,3個屬性, 可是arguments裏有1,2,3,4,5, 全部的值,這個arguments就用來存儲傳入的全部參數
對於超出形參個數以外的實參, 能夠經過arguments來得到
3. arguments 的索引 從 0, 1,2,....遞增,與實參逐個對應
4. arguments.length 屬性表明實參的個數
5. arguments必定不是數組, 是長的比較像數組的一個對象,雖然也有length屬性
6:arguments每一個函數都會有,所以,arguemnts只會在內部找自身的arguments,
沒法引用到外層的arguments
函數
1 <script type="text/javascript"> 2 // 求圓形面積,矩形面積, 三角形面積 3 function area () { 4 if(arguments.length == 1) { 5 alert(3.14 * arguments[0] * arguments[0]); 6 } else if(arguments.length == 2) { 7 alert(arguments[0] * arguments[1]); 8 } else if(arguments.length == 3) { 9 alert(arguments[0] + arguments[1] + arguments[2]); 10 } else { 11 return null; 12 } 13 } 14 area(10,20,30); 15 16 </script>
下面是W3C上的一些解釋spa
arguments 對象設計
在函數代碼中,使用特殊對象 arguments,開發者無需明確指出參數名,就能訪問它們。code
例如,在函數 sayHi() 中,第一個參數是 message。用 arguments[0] 也能夠訪問這個值,即第一個參數的值(第一個參數位於位置 0,第二個參數位於位置 1,依此類推)。對象
所以,無需明確命名參數,就能夠重寫函數:blog
function sayHi() {索引
if (arguments[0] == "bye") {
return;
}
alert(arguments[0]);
}
檢測參數個數
還能夠用 arguments 對象檢測函數的參數個數,引用屬性 arguments.length 便可。
下面的代碼將輸出每次調用函數使用的參數個數:
1 function howManyArgs() { 2 3 alert(arguments.length); 4 5 } 6 7 8 9 howManyArgs("string", 45); 10 11 howManyArgs(); 12 13 howManyArgs(12);
上面這段代碼將依次顯示 "2"、"0" 和 "1"。
註釋:與其餘程序設計語言不一樣,ECMAScript 不會驗證傳遞給函數的參數個數是否等於函數定義的參數個數。開發者定義的函數均可以接受任意個數的參數(根據 Netscape 的文檔,最多可接受 255 個),而不會引起任何錯誤。任何遺漏的參數都會以 undefined 傳遞給函數,多餘的函數將忽略。