扫码关注官方订阅号
我的理解是不能传递引用类型的数据,但是这么理解感觉不对,因为参数是可以传object对象的。求大神解答。
光阴似箭催人老,日月如移越少年。
对象当然不能传递,对象是通过对象的引用的copy传递的,就是说js中全都是值传递。
原始类型的内容是存储在栈中;而对象的内容是存储在堆中,指向堆的地址存储在栈中。原始类型传递的是存储在栈里的内容,对象传递的是存储在栈里的地址, 都是copy栈里的值来传递, 都是值传递。
首先理解值传递与引用传递的区别,记得书中有个类似的例子很好的证明:
值传递
引用传递
function setName(obj){ obj.name = 'XX' //参数按值传递,但obj和person访问的是同一个对象,修改对象会表现在参数person上 obj = new Object() //注意这里obj变量引用变掉了,如果是传递的引用,person也会变掉 obj.name = 'YY' } var person = new Object() setName(person) console.log(person.name)//输出'XX'
跟Java一样嘛,你说可以传object对象其实是传了一个指向这个对象的地址,而这个地址也是在传值中copy的新的一份。
JavaScript中的对象参数传递是按照共享传递(call by sharing)的,但是在工作细节上来说,也可以说叫做值传递。基本数据类型是按值传递的。
基础数据类型放在栈上,引用数据类型放堆上,例如这么一段代码:
var foo = 1; var bar = { value: 2 }; function baz(obj) { obj.value = 1; } baz(bar);
声明foo和bar,内存分配如下:
foo
bar
==== 栈 ==== ======== 堆 ======== + foo=1 + + bar={value:2} +
然后调用baz(bar),则参数传递如下:
baz(bar)
==== 栈 ==== ======== 堆 ======== + obj + ——— 指向 ———> + bar={value:2} + + foo=1 +
画的有点抽象。。。
简单的说:就是把bar的引用地址copy一份,存到栈里,然后把这个值传递过去(这个值就是引用bar的内存地址),而这个过程,也可以说是值传递。
类似的问题我在这里也回答过。
才疏学浅,如有疏漏,望指出。
个人站:听说
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
原始类型的内容是存储在栈中;而对象的内容是存储在堆中,指向堆的地址存储在栈中。
原始类型传递的是存储在栈里的内容,对象传递的是存储在栈里的地址, 都是copy栈里的值来传递, 都是值传递。
首先理解
值传递与引用传递的区别,记得书中有个类似的例子很好的证明:跟Java一样嘛,你说可以传object对象其实是传了一个指向这个对象的地址,而这个地址也是在传值中copy的新的一份。
JavaScript中的对象参数传递是按照共享传递(call by sharing)的,但是在工作细节上来说,也可以说叫做值传递。基本数据类型是按值传递的。
基础数据类型放在栈上,引用数据类型放堆上,例如这么一段代码:
声明
foo和bar,内存分配如下:然后调用
baz(bar),则参数传递如下:画的有点抽象。。。
简单的说:就是把bar的引用地址copy一份,存到栈里,然后把这个值传递过去(这个值就是引用bar的内存地址),而这个过程,也可以说是值传递。
类似的问题我在这里也回答过。
才疏学浅,如有疏漏,望指出。