amandakelake/blog

JavaScript的参数传递(引用类型)

amandakelake opened this issue · 0 comments

var obj = {
    value: 1
};
function foo(o) {
    o.value = 2;
    console.log(o.value); //2
}
foo(obj);
console.log(obj.value) // 2
var obj = {
    value: 1
};
function foo(o) {
    o = 2;
    console.log(o); //2
}
foo(obj);
console.log(obj.value) // 1

具体分析上面两个例子的不同,为什么都是“引用传递”,结果却不一样

引用传递,就是传递对象的引用,函数内部对参数的任何改变都会影响该对象的值,因为两者引用的是同一个对象

引用数据类型的值是保存在堆内存中的对象,JavaScript不允许直接访问堆内存中的位置,因此我们不能直接操作对象的堆内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。因此,引用类型的值都是按引用访问的。这里的引用,我们可以理解为保存在变量对象中的一个地址,该地址与堆内存的实际值相关联;

这样一来就好理解了,如果修改了这个“地址”,o = 2那么引用就完全被改写了
如果修改的是“地址”下面的属性,o.value = 2,那么更改的就是原来的引用数据本身