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