理解Javascript參數中的arguments對象


    ECMAScript中函數沒有標簽名的特性,所以ECMAScript函數中沒有重載。

   Javascript中arguments的存在可以彌補javascript中函數沒有重載的不足。

   Javascript中函數中的參數是以數組的形式保存的,所以在JavaScript中調用函數給函數傳遞的參數時,不會受到我們定義函數時設置的參數個數的限制。也就是說如果我們給一個函數定義了2個參數,我們傳遞的時候可以不傳,可以傳一個,也可以傳兩個,傳三個...都可以,不會受函數參數個數的影響。arguments類似一個數組(但是不是真正的Array對象),同樣可以像數組一樣用方括號來訪問它的每一個值,並用arguments.length來判斷參數的個數。

    應該說我們可以向ECMAScript(javascript是對ECMAScript標准的實現)函數任意的傳遞參數,並可以通過arguments對象來訪問這些參數。

arguments的使用:

function myfun() {
	console.log(arguments.length);
}

myfun("1","2");//2
myfun("1");//1
myfun();//0

  

function myfun(num1,num2) {
	if(arguments.length === 1){
		console.log(arguments[0]);
	} else if(arguments.length === 2) {
		console.log(arguments[0]+arguments[1]);
	} else if(arguments.length === 3) {
		console.log(num1+num2+arguments[2]);
	}else {
		console.log(arguments[0]+" "+num1);
	}
	
}
myfun(1);//1
myfun(1,2);//3
myfun(1,2,3);//6
myfun();//undefined  undefined

     命名參數可以和arguments一起使用

     和其他oo語言不一樣,在ECMAScript中,所有參數傳遞的都是值,不可能通過引用傳遞參數(畢竟arguments中保存的都是參數的值)。

     arguments對象中還定義了callee屬性,用來引用當前正在執行的函數,例如在遞歸中使用:

function factorial(num) {
	if(num <=1 ) {
		return 1;
	} else {
		return num*arguments.callee(num-1);
	}
}

console.log(factorial(5));//120

 

 需要注意的是如果一個函數的參數有3個,傳遞的實參只有2個,那么arguments[2]和第三個參數是不共享的.

function foo(x, y, z) {
 
  // 聲明的函數參數數量arguments (x, y, z)
  console.log(foo.length); // 3
 
  // 真正傳進來的參數個數(only x, y)
  console.log(arguments.length); // 2
 
  // 參數的callee是函數自身
  console.log(arguments.callee === foo); // true
 
  // 參數共享
 
  console.log(x === arguments[0]); // true
  console.log(x); // 10
 
  arguments[0] = 20;
  console.log(x); // 20
 
  x = 30;
  console.log(arguments[0]); // 30
 
  // 不過,沒有傳進來的參數z,和參數的第3個索引值是不共享的

  z = 40;
  console.log(arguments[2]); // undefined
 
  arguments[2] = 50;
  console.log(z); // 40
 
}
 
foo(10, 20);

  

 


免責聲明!

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



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