高级程序设计【3】之3.7.1理解参数

function test(a){
	console.log(a);
	console.log(arguments[0] == a);  // true
}

对于上例,一般argumentsa并不会访问同一个内存空间,因为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地址

你可能感兴趣的:(javascript)