Project1

标题: 请教一个关于JS的基础问题,汗颜中……………… [打印本页]

作者: rexuegg123    时间: 2021-6-8 11:31
标题: 请教一个关于JS的基础问题,汗颜中………………
例子:
var obj  = {x1:456,x2:789};
var xob = obj;
xob.x1 = 123;
console.log(obj.x1); //123

意思就是xob并不是独立的,其中的变量变化时,obj中也会相应变化。有没办法使两者相对独立,不关联?
作者: yuyering    时间: 2021-6-8 12:51
给新对象直接赋值旧对象相当于浅拷贝,这样两者还是有关联的。
你想要实现的应该是对象的深拷贝,
比如
var obj = {a:1,b:2}  
var newObj = JSON.parse(JSON.stringify(obj));
newObj.a=3;   
console.log(obj);  
console.log(newObj);  

这是其中一种方法,你可以按js 对象 深拷贝 这样的关键词来查一查
作者: rexuegg123    时间: 2021-6-8 14:26
yuyering 发表于 2021-6-8 12:51
给新对象直接赋值旧对象相当于浅拷贝,这样两者还是有关联的。
你想要实现的应该是对象的深拷贝,
比如

OK!谢谢!
作者: fux2    时间: 2021-6-8 18:02
实际上直接赋值浅拷贝也算不上,多数情况下浅拷贝也已经够用
你可以试试,不过最好还是理解几种情况的区别再具体应用
var newObj = obj.slice(0);
作者: rexuegg123    时间: 2021-6-8 18:45
本帖最后由 rexuegg123 于 2021-6-8 18:49 编辑
fux2 发表于 2021-6-8 18:02
实际上直接赋值浅拷贝也算不上,多数情况下浅拷贝也已经够用
你可以试试,不过最好还是理解几种情况的区别 ...


已经在网上看过了,有好几种方法,各有优缺点,比较稳妥的还是自己写一个判断类型并遍历深层拷贝的

slice()只能用于数组吧?
作者: 喵呜喵5    时间: 2021-6-8 23:28
深拷贝,无脑 JSON.parse+JSON.stringify,注意处理那些json序列化会丢的东西

浅拷贝面向新浏览器我都直接 obj = { ...obj } arr = [ ...arr ]
作者: 阿诺奈亚    时间: 2021-6-9 00:12
印象中MV自带深拷贝函数:JsonEx.makeDeepCopy(对象)
作者: MH-Pride    时间: 2021-6-9 04:54
本帖最后由 MH-Pride 于 2021-6-9 04:58 编辑

他们都是指向同一个值 所以值变 他们得到的值也会变  这是我的理解如果没有记错的话

作者: 小怪兽奇奇侠    时间: 2021-6-9 07:43
那可不可以这样呢?
xob=obj
xab=obj
xob.a=111
console.log(xab);  
xab是不是原来的obj?
作者: lisliz    时间: 2021-6-9 09:07
看到楼上很多都说用json序列化+反序列化做深拷贝,我就想起了最近遇到的一个问题,某些Game_XXX里引用的同一个对象在存档后变成两个对象了。
作者: 清澈淌漾    时间: 2021-6-9 15:38
封个方法 new个对线 拿参数一个数值一个数值赋上 在反回去
作者: 仇九    时间: 2021-6-9 17:32
lisliz 发表于 2021-6-9 09:07
看到楼上很多都说用json序列化+反序列化做深拷贝,我就想起了最近遇到的一个问题,某些Game_XXX里引用的同 ...

我在写存档脚本的时候也遇到过。读取存档中的变量的时候,如果变量地址没有设置清楚,那么就会出现两个对象的问题ヽ(ー_ー)ノ




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1