demo1:
因为对象是引用类型,这里把obj1的内容赋值给了changeObj函数里面的局部变量obj,他们指向的是同一个内存地址,所以直接修改了。
let obj1 = { age: 1 };
function changeObj(obj){
obj.age = 2;
}
changeObj(obj1);
console.log(obj1); // { age: 2 }
demo2:
函数调用时传递的变量参数都是值传递(引用传递传的内存地址也属于变量值的传递),这里其实就是把obj1的内容赋值给了coverObj函数的局部变量obj,然后给局部变量obj重新赋值,是俩个完全不相关的变量了,所以给局部变量做的任何操作都不会影响全局变量obj1。
注:函数执行完,函数内部的局部变量就会自动释放,局部变量obj所指向的对象就成为垃圾对象,之后会被垃圾回收器回收。
let obj1 = { age: 1 };
function coverObj(obj) {
console.log(obj); // { age: 1 }
console.log(obj1); // { age: 1 }
obj = { age: 2 };
console.log(obj); // { age: 2 }
console.log(obj1); // { age: 1 }
}
coverObj(obj1);
console.log(obj1); // { age: 1 }
demo3:
看这个例子更直观,其实和上面一个意思。
let obj1 = { age: 1 };
let obj2 = obj1;
obj1 = 3;
console.log(obj1); // 3
console.log(obj2); // { age: 1 }