将对象作为参数并在函数体内直接赋值为什么不会更改对象?

2019-03-22 15:09:10 +08:00
 victorhe0601
let spaceship = {
homePlanet : 'Earth',
color : 'red'
};
let tryReassignment = obj => {
obj = {
identified : false,
'transport type' : 'flying'
}
console.log(obj) // Prints {'identified': false, 'transport type': 'flying'}

};
tryReassignment(spaceship) //

这段代码并没有更改 spaceship 的值,为什么?背后的逻辑是什么?
2652 次点击
所在节点    JavaScript
9 条回复
victorhe0601
2019-03-22 15:11:31 +08:00
按照仅仅是传入 reference 的说法,在重新赋值的时候,应该 reference 的对应的值就会发生变化吧。
shintendo
2019-03-22 15:20:02 +08:00
外面的 spaceship 和里面的 obj 是两个不同的变量,只不过内容相同,都是指向同一个对象的引用
你在里面给 obj 重新赋值,就使它指向了另一个对象
js 传参从来没有 by reference,只有 by value
dablwow
2019-03-22 15:25:31 +08:00
重新赋值改变的是 obj 保存的地址,原对象并没有被改变
victorhe0601
2019-03-22 15:30:03 +08:00
@shintendo 嗯,清楚了。底层的逻辑:字面值(这个例子中的{
identified : false,
'transport type' : 'flying'
})是先存入内存,字面值有了 reference 之后才被赋值给参数 obj,而不是一个变量赋值了之后,再把字面值存入。对吧?
victorhe0601
2019-03-22 15:34:19 +08:00
谢谢 @shintendo @victorhe0601。结贴。希望这里有个结贴的功能来确保 close 掉的帖子:可以被搜索(内外部),但是不会在 parent 论坛显示或者说明 close 掉了,不然会浪费大家的时间,以为还没有解决。
victorhe0601
2019-03-22 15:47:40 +08:00
@shintendo 关于传参是否有 by reference,https://stackoverflow.com/questions/7744611/pass-variables-by-reference-in-javascript,你对 JS 真的弄得非常清楚。再次感谢。
xiadd
2019-03-22 15:49:19 +08:00
完全把这里当 stackoverflow 用了 我看看你还能发几个类似的帖子
victorhe0601
2019-03-22 15:58:55 +08:00
@xiadd, 有通过 stackoverflow 去提问,但是因为刚刚进入,有发帖限制。不过我确实把这里当成中国的 stackoverflow。我会暂时停止发帖转到 segmentfault 试一下。
zzjas98
2019-03-23 02:37:39 +08:00
这个和 pass be reference 还是 pass by value 没有什么关系,就是对 reference 的理解有了偏差。

https://s3-us-west-1.amazonaws.com/zzjas/public/Image_nKHsu0XuiO.png

这么写不涉及 functoin call 也是一样的问题。

reference 就是类似一个 int,存了一个内存地址而已,无论在哪里你用 = 去给这个 int 重新赋值时候,你只改了这一个 reference 存的数字,其他的 reference 的值都不会被改变。你去改这个新地址下的 object,别的 reference 当然不会被改。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/547431

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX