我的理解是不能传递引用类型的数据,但是这么理解感觉不对,因为参数是可以传object对象的。求大神解答。
我的理解是不能传递引用类型的数据,但是这么理解感觉不对,因为参数是可以传object对象的。求大神解答。
JavaScript中的对象参数传递是按照共享传递(call by sharing)的,但是在工作细节上来说,也可以说叫做值传递。基本数据类型是按值传递的。
基础数据类型放在栈上,引用数据类型放堆上,例如这么一段代码:
var foo = 1;
var bar = { value: 2 };
function baz(obj) {
obj.value = 1;
}
baz(bar);
声明foo
和bar
,内存分配如下:
==== 栈 ==== ======== 堆 ========
+ foo=1 + + bar={value:2} +
然后调用baz(bar)
,则参数传递如下:
==== 栈 ==== ======== 堆 ========
+ obj + ——— 指向 ———> + bar={value:2} +
+ foo=1 +
画的有点抽象。。。
简单的说:就是把bar的引用地址copy一份,存到栈里,然后把这个值传递过去(这个值就是引用bar的内存地址),而这个过程,也可以说是值传递。
类似的问题我在这里也回答过。
才疏学浅,如有疏漏,望指出。
个人站:听说
原始类型的内容是存储在栈中;而对象的内容是存储在堆中,指向堆的地址存储在栈中。
原始类型传递的是存储在栈里的内容,对象传递的是存储在栈里的地址, 都是copy栈里的值来传递, 都是值传递。
10 回答11.7k 阅读
2 回答3.2k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
3 回答856 阅读✓ 已解决
3 回答1k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
首先理解
值传递
与引用传递
的区别,记得书中有个类似的例子很好的证明: