老师,如果state是引用类型,我们可以用...
来做浅拷贝,然而对于深层嵌套的对象来讲,浅拷贝的对象里存放的仍然是指针。也就是说,通过一个浅拷贝的对象去改深层对象的属性,实际上改的是堆内存中的同一个地址。
constructor(props) {
super(props);
this.state = {
count: 0,
obj: {name: 'zhangsan'},
}
}
increase = () => {
const shallowCopy = { ...this.state };
setTimeout(() => {
shallowCopy.obj.name = 'lisi';
console.log(this.state); // 其实这里state.obj.name已经变为lisi了
this.setState(shallowCopy);
})
}
又或者,甚至不做浅拷贝,直接换指针,也没报错。
increase = () => {
const anotherPointer = this.state;
setTimeout(() => {
anotherPointer.obj.name = 'lisi';
console.log(this.state); // 这里state.obj.name也已经变为lisi了
this.setState(anotherPointer);
})
}
所以,不可变值对于嵌套多的引用类型来说,是不是只要换个指针重新赋值就行了?(甚至不需要做浅拷贝)。
毕竟,一个嵌套多层的对象,更改了比如info.basic.name
这样一个深层属性,应该不需要把整个info
对象深拷贝一遍再替换原来的吧?
看起来只需要换个指针就能欺骗react了。