文章内三个情况的个人理解
首先是实参是原始类型
var value = 1;
function foo(v) {
// 这里应该是将value赋值给v 这个时候v等于1
v = 2;
console.log(v); //2
}
foo(value);
console.log(value) // 1
相当于将 value 拷贝给 v 此时 value 和 v 分别在两个不同的内存空间,这时候不管是修改v还是value都是修改各自内存空间的值,互不影响
然后实参是引用类型
var obj = {
value: 1
};
function foo(o) {
o.value = 2;
console.log(o.value); //2
}
foo(obj);
console.log(obj.value) // 2
这里的实参是obj对象,当实参obj对象给foo函数的形参o赋值的时候是将obj对象的在堆内存的指向拷贝给o,这时相当于obj和o都是指向对象 {value:1}。所以在修改o的时候其实也会影响到obj,因为它们指向的都是一个对象
原文是这么说的 按共享传递是传递对象的引用的副本
第三种 实参是对象的一个值,其实也是相当于原始类型
var obj = {
value: 1
};
function foo(o) {
o = 2;
console.log(o); //2
}
foo(obj);
console.log(obj.value) // 1
这里obj.value(值为1)作为实参拷贝给形参因为拷贝的是原始类型的值,就直接开辟了一个新的内存空间值为1并赋值给o。这个时候修改o的值为2,也只是修改新开辟的内存空间的值由1改为2,并不会影响到obj.value的值