高級プログラム設計【3】の3.7.1パラメータを理解する

10225 ワード

function test(a){
	console.log(a);
	console.log(arguments[0] == a);  // true
}
上記の例では、argumentsは、aと同じメモリ空間にはアクセスしない.argumentsはパラメータによって与えられたものであるので、パラメータが基本タイプの場合は、argumentsは、同じアドレスを指すのではなく、パラメータの値を直接コピーする.ただし、パラメータが参照タイプの場合は、同じアドレスを指します.【p 66とは異なる】
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'}
}
後の文の【p 71】で強調されたパラメータは値によって伝達されますが、私は特にその意味を理解していません.変数は対応するアドレスを指し、その値を表示するだけです.新しいオブジェクトを設定すると、必ず元のアドレスを切って、新しいアドレスを割り当てずに新しいアドレスを指します.
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