javascript中函数的arguments实参集合

1、arguments是实参集合,类似于数组,却不是数组

在JavaScript中,arguments对象是比较特别的一个对象,实际上是当前函数的一个内置属性。arguments非常类似Array,但实际上又不是一个Array实例。
如果用typeof arguments,返回的是’object’。虽然我们可以用调用数据的方法来调用arguments。比如length,还有index方法。但是数组的push和pop对象是不适用的。

可以通过如下代码得以证实(当然,实际上,在函数funcArg中,调用arguments是不必要写成funcArg.arguments,直接写arguments即可)。

Array.prototype.testArg = "test";
function funcArg() {
    alert(funcArg.arguments.testArg);  
    alert(funcArg.arguments[0]);
}

alert(new Array().testArg); // result: "test"
funcArg(10);                // result: "undefined"  "10"

把arguments对象转换成一个真正的数组的几种方法:

(1)var args = Array.prototype.slice.call(arguments);

(2)var args=[].slice.call(argumens,0);

(3)var args = [];
for (var i = 0; i < arguments.length; i++) {
args.push(arguments[i]);
}

(4)通用方法:

var toArray = function(s){
    try{
        return Array.prototype.slice.call(s);
    } catch(e){
        var arr = [];
        for(var i = 0,len = s.length; i < len; i++){
            //arr.push(s[i]);
               arr[i] = s[i];  //据说这样比push快
        }
         return arr;
    }
}

2、arguments对象的长度是由实参个数个数决定的。

形参是函数内部重新开辟内存空间存储的变量,但是其与arguments对象内存空间并不重叠。对于arguments和值都存在的情况下,两者值是同步的,但是针对其中一个无值的情况下,对于此无值的情形值不会得以同步。如下代码可以得以验证。

function f(a, b, c){
    alert(arguments.length);   // result: "2"
    a = 100;
    alert(arguments[0]);       // result: "100"
    arguments[0] = "qqyumidi";
    alert(a);                  // result: "qqyumidi"
    alert(c);                  // result: "undefined"
    c = 2012;
    alert(arguments[2]);       // result: "undefined"
}

f(1, 2);

但是实参和形参之间是相互影响的,比如如果修改了 arguments[0]=”hello”那么a 的值也会变成hello.

3、Arguments的适用条件:实参个数和形参个数不同
(JavaScript中形参的个数严格意义上来讲只是为了方便在函数中的变量操作,实际上实参已经存储在arguments对象中了。)
JavaScript中函数是不能重载的,但是Arguments对象能够模拟重载。

4、属性:callee
arguments.callee返回此arguments对象所在的当前函数引用,仅当相关函数正在执行时才可用。初始值就是正被执行的 Function 对象,这允许匿名的递归函数。
在使用函数递归调用时推荐使用arguments.callee代替函数名本身。表示对函数对象本身的引用,也就是所指定的 Function 对象的正文,这有利于实现无名函数的递归或者保证函数的封装性。

  function count(a){
     alert(a);//10,9,8,7,6,5,4,3,2,1
     if(a==1){
         return 1;
     }
      return a + arguments.callee(--a);
   }
     var b = count(10);
     alert(b);//55, 相当于10,9,8,7,6,5,4,3,2,1求和

5、与局部变量参数的关系:

           var a=1;
           function fn2(a){
               alert(arguments[0]);
               arguments[0]=3;
               alert(a);//3
               var a=2;
               alert(arguments[0]);//2
           }
           fn2(a);
           alert(a);//1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值