function test(a){
console.log(a);
console.log(arguments[0] == a); // true
}
对于上例,一般arguments
与a
并不会访问同一个内存空间,因为arguments
是通过参数赋值的,故若参数为基本类型时,arguments
直接拷贝参数的值,而非指向同一地址。但若参数为引用类型,则会指向同一地址。【与p66有异】
var a = 2;
test(a); // a为基本类型,故只拷贝值
function test(){
console.log(a); // 2
console.log(arguments[0]); // 2
arguments[0] = arguments[0] + 2;
console.log(a); // 2
console.log(arguments[0]); // 4
}
var b = {name:'b'};
test2(b); // b为引用类型,arguments指向b的地址
function test2(){
console.log(arguments[0]); // {name:'b'}
b.age = 2;
console.log(arguments[0]); // {name:'b', age:2}
arguments[0].f = 'zs';
console.log(arguments[0] == b); // true
console.log(arguments[0]); // {name:'b', age:2, f: 'zs'}
console.log(b); // {name:'b', age:2, f: 'zs'}
}
至于后文【p71】所强调的参数是按值传递的,我其实不是特别理解其中的意思,因为变量只是指向对应的地址,显示其值,一旦重新设定一个新对象,必定会断开原先指向的地址,进而指向新地址,而非对原地址进行赋值
var a = {name:'a'}; // 指向A地址
var a1 = a; // 指向A地址
console.log(a) // {name:'a'}
console.log(a1) // {name:'a'}
a = {age: 23} // 重新赋值,指向B地址
console.log(a) // {age: 23}
console.log(a1) // {name:'a'} 仍旧指向A地址
而若要对原地址进行值的修改,以上代码改为如下
var a = {name:'a'}; // 指向A地址
var a1 = a; // 指向A地址
console.log(a) // {name:'a'}
console.log(a1) // {name:'a'}
delete a.name; // 删除属性,a仍指向A地址
a.age = 23; // 增加属性,a仍指向A地址
console.log(a) // {age: 23} 仍旧指向A地址
console.log(a1) // {age: 23} 仍旧指向A地址