JavaScript引用变量作为函数参数的相关问题?
发布于 6 年前 作者 BIXIAOJIE 2993 次浏览 来自 问答

下面是代码

function setName(obj) {
    obj.name = 'Harry';

    obj = new Object();
    obj.name = 'Lucy';
}


var person = new Object();
person.name = 'Bob';
setName(person);
console.log(person.name);

引用变量作为函数参数的时候,是值的复制还是引用的复制。在《JavaScript高级程序设计》第四章第一节中讲的知识点是。无论是引用类型还是基本类型,在函数的参数中都是按照值传递的?但是从我的角度来看,JavaScript中引用变量作为参数也是以引用的方式传递的。他们的内存地址也是相同的。

我的问题是,JavaScript中引用变量作为函数参数的时候,这个参数是以值传递的,还是以引用的方式传递的?

7 回复

引用类型就是我们说的对象咯 自豪地采用 CNodeJS ionic

值传递 引用类型传递的是引用的值。

function setName(obj) { obj = null; }

var person = new Object(); person.name = ‘Bob’; setName(person); console.log(person);
如果是引用传递 person应该变成null

@dewfall123 谢谢您 。如果在函数中只执行

obj.name = “bixiaojie”;

可是外部的person的name属性也会随之改变。我是否可以认为,函数内部的obj和函数外部的person指向了同一个内存地址。

您说,“引用类型传递的是引用的值”,这个值指的是引用的具体的值,还是内存地址呢?

原谅我有点刨根问底了,因为我想弄清楚每一个问题。 感谢您的回答。

image.png 图盗自知乎

我是否可以认为,函数内部的obj和函数外部的person指向了同一个内存地址。

obj 和 person这两个引用类型的值(堆地址)是同一个, 但是它们是两个引用 let a = 1; let b =1; 类似 a 和 b是两个number,值是相等的 ------> obj 和 person是两个引用,值是相等的。

“引用类型传递的是引用的值”,这个值指的是引用的具体的值,还是内存地址呢?

引用的值就是堆地址,也就是内存地址

@dewfall123 正解,栈内存存简单值(含堆内存地址),堆内存存复杂值,被栈内存引用

来自酷炫的 CNodeMD

@dewfall123 谢谢您回复。很棒的答案。 From Noder

@Alalabu 谢谢! From Noder

回到顶部