javascript之参数按值传递

javascript之参数按值传递

js中基础数据类型在栈中存储:

js中引用型数据类型,变量名和地址存放在栈,变量值存放在堆内存:

下面来看函数中的参数传值:

按值传递

var value = 1;
function foo(v) {
    v = 2;
    console.log(v); //2
}
foo(value);
console.log(value) // 1
复制代码

改变前:

栈内存 堆内存
value: 1
v: 1

改变后:

栈内存 堆内存
value:1
v:2

很好理解,当传递 value 到函数 foo 中,相当于拷贝了一份 value,假设拷贝的这份叫 _value,函数中修改的都是 _value 的值,而不会影响原来的 value 值。

按引用传递

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

改变前:

栈内存 堆内存
obj, o —–>指针地址 {value: 1}

改变后:

栈内存 堆内存
obj, o —–>指针地址 {value: 2}
var obj = {
    value: 1
};
function foo(o) {
    o = 2;
    console.log(o); //2
}
foo(obj);
console.log(obj.value) // 1
复制代码

改变前:

栈内存 堆内存
obj, o —–>指针地址 {value: 1}

改变后:

栈内存 堆内存
obj —–>指针地址 {value: 2}
o:2

看到这里,我其实有点疑惑,既然是按引用传递,即实参和形参指向同一块堆地址,为什么在o赋值为2后,obj.value依旧为1呢?

看到这里我们可以这么理解:传递对象的引用的副本,也就是假设obj对应的内存地址是0011,那么变量o在栈里面存放的也是这个地址,我们将常量2赋值给o之后,其实o在栈中存放的就不是0011,而只是常量2.

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享