最近在使用Redux想到一个问题,Redux里经常使用的一种语法是这样的:code
setSth(state, { payload }) { const { newthing} = payload; return { ...state, newthing } }
Redux经过解构赋值...state,保留了state里未修改的部分,并覆盖修改的部分,那么如今问题来了,这里的新对象经过解构得来的...state,是不是原来属性的引用赋值呢?对象
咱们知道,以下状况:递归
let state = {a: 1, b: 2} let state2 = state; state2.a = 5; // state.a === 5 => true
这里state2是state的一个引用赋值。
那么使用解构赋值生成一个新对象会如何呢?语法
let state = {a: 1, b: 2} let state2 = { ...state } state2.a = 5; // state.a === 1 => true
经过实验可见,state2属性的修改并无影响到state,因此这是一份拷贝,那么问题又来了,这个拷贝是只有一层的浅拷贝,仍是递归进去的深拷贝呢,我直觉地认为是深拷贝,因而又作了一个实验:引用
let state = {a: {a1: 1, a2: 2}, b: 2} let state2 = { ...state } state2.a.a1 = 5; // state.a.a1 === 5 => true
事实证实个人直觉错了,解构复制到全新对象里只是浅拷贝,对象里属性的属性仍是对原来对象里属性的属性的一个引用,由于解构赋值能够生成一份浅拷贝,其实咱们针对已知结构的对象也能够所有使用这个方法实现本身想要的拷贝。好比上例中:方法
let state = {a: {a1: 1, a2: 2}, b: 2} let state2 = { ...state, a: { ...state.a } }
但愿能够帮助你们。co