デフォースは深コピーですか?
1056 ワード
最近Reduxを使って一つの問題を思い付きました.Reduxでよく使われている文法はこうです.
私たちは下記の状況を知っています.
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
ここstate 2はstateの引用賦課です.構成解除値を使って新しいオブジェクトを生成するとどうなりますか?let state = {a: 1, b: 2}
let state2 = { ...state }
state2.a = 5;
// state.a === 1 => true
実験によって、state 2属性の修正はstateに影響していません.だからこれはコピーです.問題はまた来ました.これは1階の薄いコピーですか?それとも再帰的な深コピーですか?直感的には深コピーだと思います.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 } }
みんなを助けることができることを望みます.