arguments相当于一个“伪数组”
ECMAScript函数的参数和其他的语言还是有些不同的,他并不介意你传进来多少个参数,以及参数的数据类型;通俗的说,即使你在定义函数时,只设置了两个形参,那么在调用这个函数时,你给他传递一个、二个,或者是四个、五个他都能接收,之所以会这样是因为在ECMAScript中的参数内部是用一个数组来表示的,实际操作中,在函数体内是通过arguments对象来访问这个参数数组,从而获取传递给函数的每个参数;arguments对象只是与数组类似,但他并不是一个数组,可以把它叫做伪数组,你也可以把它叫做其他的都可以。
arguments的有趣之处
先看一个正常的例子
function demo1(a){
console.log(a);
}
demo1(2);
这里给函数传递一个实参2,所以会打印数字 2;如下:
然后我们打印下arguments[0],他的索引类似于数组,也就是第一个数据,如下:
function demo1(a){
console.log(a);
console.log(arguments[0]);
}
demo1(2);
打印结果如下:
当我们传递的实参个数大于形参的个数时
function demo1(a){
console.log(a);
console.log(arguments);
console.log(arguments[2]);
}
demo1(2,3,4);
结果如下:
打印的结果说明,arguments的确能够接受到传递过来的所有数据,把他们都给装进了一个数组里,并且可以通过索引拿到相应的值,当然索引是从0开始的;
当我们手动分别给形参和形参对应的arguments赋值
给形参赋值
function demo1(a){
a=10;
console.log(a);
console.log(arguments[0]);
}
demo1(2,3,4);
给arguments赋值
function demo1(a){
arguments[0]=20;
console.log(a);
console.log(arguments[0]);
}
demo1(2,3,4);
从结果可以看出,当实参的个数大于等于形参的个数时,通过手动改变形参的值,arguments的值,不管改的是两者中的哪一个,都会影响对应双方的值;
当我们传递的实参个数小于形参的个数时
function demo1(a,b){
console.log(a);
console.log(b);
console.log(arguments[0]);
console.log(arguments[1]);
}
demo1(2);
结果如下:
从结果来看,直接访问形参和访问伪数组对应的下标的值相同,这时我们会默认为他们访问的是同一个内存地址,实则不是;我们看下面的例子:
function demo1(a,b){
b=20;
console.log(a);
console.log(b);
console.log(arguments[0]);
console.log(arguments[1]);
}
demo1(2);
结果显示,当我们给b直接赋值的时候,打印的结果显示,arguments[1]的值依旧是undefined,b的值是20;为什么会这样呢?他们不是相照应吗?
结论
答案是他们的内存空间是独立的,他们的值会同步,而同步也是要分情况的;
当我们传递的实参个数大于形参的个数时
,改变形参对应的值,arguments中也会更新,反之也是如此;
当我们传递的实参个数小于形参的个数时
,赋值的形参对应的值被改变,arguments中也会更新,反之也是如此;没有赋值的形参对应的值被改变,arguments对应的值并不会改变;因为arguments对象的大小是由传入的实参的个数决定的,并不是由定义的命名参数的个数决定的,没有传递值的形参将会自动被赋予undefined值,这就跟定义了变量但没有初始化一样。