最近在使用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