将对象作为参数并在函数体内直接赋值为什么不会更改对象?
- 0次
- 2021-08-31 22:40:38
- idczone
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 的值,为什么?背后的逻辑是什么?
按照仅仅是传入 reference 的说法,在重新赋值的时候,应该 reference 的对应的值就会发生变化吧。
外面的 spaceship 和里面的 obj 是两个不同的变量,只不过内容相同,都是指向同一个对象的引用
你在里面给 obj 重新赋值,就使它指向了另一个对象
js 传参从来没有 by reference,只有 by value
重新赋值改变的是 obj 保存的地址,原对象并没有被改变
嗯,清楚了。底层的逻辑:字面值(这个例子中的{
identified : false,
'transport type' : 'flying'
})是先存入内存,字面值有了 reference 之后才被赋值给参数 obj,而不是一个变量赋值了之后,再把字面值存入。对吧?
谢谢 @victorhe0601。结贴。希望这里有个结贴的功能来确保 close 掉的帖子:可以被搜索(内外部),但是不会在 parent 论坛显示或者说明 close 掉了,不然会浪费大家的时间,以为还没有解决。
关于传参是否有 by reference,https://stackoverflow.com/questions/7744611/pass-variables-by-reference-in-javascript,你对 JS 真的弄得非常清楚。再次感谢。
完全把这里当 stackoverflow 用了 我看看你还能发几个类似的帖子
@xiadd, 有通过 stackoverflow 去提问,但是因为刚刚进入,有发帖限制。不过我确实把这里当成中国的 stackoverflow。我会暂时停止发帖转到 segmentfault 试一下。
这个和 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 当然不会被改。