zoukankan      html  css  js  c++  java
  • 理解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);
    

      

  • 相关阅读:
    Conntect Bluetooth devices in iOS.
    Why NSAttributedString import html must be on main thread?
    IOS7 SDK 几宗罪
    How to browse the entire documentation using XCode 5 Documentation and API Reference ?
    High Precision Timers in iOS / OS X
    [UWP]抄抄《CSS 故障艺术》的动画
    [Microsoft Teams]使用连接器接收Azure DevOps的通知
    [WPF 自定义控件]自定义一个“传统”的 Validation.ErrorTemplate
    [WPF 自定义控件]在MenuItem上使用RadioButton
    [WPF 自定义控件]创建包含CheckBox的ListBoxItem
  • 原文地址:https://www.cnblogs.com/yy95/p/5762606.html
Copyright © 2011-2022 走看看