天天看點

js 的arguments的一些了解資料

初學js的時候,對arguments這個東西常見,就是搞不清他的意思~ 下面是我找到的一些資料和我的了解,終于弄懂了這個家夥

    首先arguments指向實參對象

  在函數體内,辨別符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上的一些解釋

arguments 對象

在函數代碼中,使用特殊對象 arguments,開發者無需明确指出參數名,就能通路它們。

例如,在函數 sayHi() 中,第一個參數是 message。用 arguments[0] 也可以通路這個值,即第一個參數的值(第一個參數位于位置 0,第二個參數位于位置 1,依此類推)。

是以,無需明确命名參數,就可以重寫函數:

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 傳遞給函數,多餘的函數将忽略。

轉載于:https://www.cnblogs.com/nostic/p/5406472.html

繼續閱讀