“ECMAScript中的所有参数传递的都是值,不可能引用传递参数。”这句话应该怎么理解?

图片描述
我的理解是不能传递引用类型的数据,但是这么理解感觉不对,因为参数是可以传object对象的。求大神解答。

阅读 4.6k
5 个回答

首先理解值传递引用传递的区别,记得书中有个类似的例子很好的证明:

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'

JavaScript中的对象参数传递是按照共享传递(call by sharing)的,但是在工作细节上来说,也可以说叫做值传递。基本数据类型是按值传递的。

基础数据类型放在栈上,引用数据类型放堆上,例如这么一段代码:

var foo = 1;
var bar = { value: 2 };
function baz(obj) {
    obj.value = 1;
}
baz(bar);

声明foobar,内存分配如下:

==== 栈 ====          ======== 堆 ========
+   foo=1  +          +  bar={value:2}  +

然后调用baz(bar),则参数传递如下:

==== 栈 ====               ======== 堆 ========
+   obj    +  ——— 指向 ———>  +  bar={value:2}  +
+   foo=1  +

画的有点抽象。。。

简单的说:就是把bar的引用地址copy一份,存到栈里,然后把这个值传递过去(这个值就是引用bar的内存地址),而这个过程,也可以说是值传递

类似的问题我在这里也回答过。

才疏学浅,如有疏漏,望指出。

个人站:听说

对象当然不能传递,对象是通过对象的引用的copy传递的,就是说js中全都是值传递。

原始类型的内容是存储在栈中;而对象的内容是存储在堆中,指向堆的地址存储在栈中。
原始类型传递的是存储在栈里的内容,对象传递的是存储在栈里的地址, 都是copy栈里的值来传递, 都是值传递。

跟Java一样嘛,你说可以传object对象其实是传了一个指向这个对象的地址,而这个地址也是在传值中copy的新的一份。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题