Angular对象引用问题:tempcard与card修改后值为何一致?
问题根源:对象引用传递导致的属性同步问题
这是个很典型的JavaScript引用类型坑!你忽略了对象在JavaScript中是按引用传递的,不是按值传递。
咱们拆解下你的代码逻辑:
- 一开始
card是一个board1LaneId为79的对象 - 你写了
let tempcard = card;,这行代码并没有复制出一个新的对象,只是让tempcard变量和card变量指向内存中同一个对象。就像两个人拿着同一扇门的钥匙,不管谁开门,看到的都是同一个房间。 - 调用
chs.moveLane(dest)时,Service里直接修改了this.card的board1LaneId为25——而this.card就是你最初传入的那个对象,也就是tempcard和card共同指向的对象。 - 所以当你第二次打印时,
tempcard和新的card变量(因为moveLane返回的还是原对象)指向的都是被修改后的同一个对象,自然两个值都是25。
解决方案:创建对象的副本
要让tempcard保存修改前的状态,你需要复制出一个独立的新对象,而不是直接赋值引用。根据你的对象结构,有几种常用方法:
- 对象展开运算符(推荐,浅拷贝):
let tempcard = {...card};
- Object.assign(浅拷贝):
let tempcard = Object.assign({}, card);
如果你的card是嵌套对象(比如里面还有子对象),上面的浅拷贝只会复制顶层属性,子对象还是引用。这时候需要用深拷贝,比如:
let tempcard = JSON.parse(JSON.stringify(card));
⚠️ 注意:这种方法会丢失函数、Symbol类型的属性,还有循环引用的对象也无法处理,如果有这类场景需要用专门的深拷贝工具(比如Lodash的_.cloneDeep)。
修改后的代码:
//card是board1LaneId设为79的对象 console.log('new call') let chs = new CardHelperService(card, this.flatTypes, this.auth); let tempcard = {...card}; // 这里改成创建副本 console.log('card (' + tempcard.id + ')moved: \n' + tempcard.board1LaneId + ' to ' + card.board1LaneId + '\n') card = chs.moveLane(dest); //调用自定义Service console.log('card (' + tempcard.id + ')moved: \n' + tempcard.board1LaneId + ' to ' + card.board1LaneId + '\n')
这样tempcard就保存了修改前的对象状态,第二次打印时就能看到79 to 25的预期结果了。
内容的提问来源于stack exchange,提问作者Rilcon42
相关产品推荐
相关产品推荐

