JSオブジェクトコピーのいくつかの方法、および引用符の問題
1840 ワード
今日プロジェクトをしているとき、オブジェクトに値を付けると、フィールド名が間違ってobjectになりました.次に、オブジェクトコピーのいくつかの方法をテストしました.拡張演算子、Object.assign()、JSON変換.
出力結果は次のとおりです.
見つかりましたか.dataフィールドは変更されず、最後に[object Object]フィールドが1つ増えました.なぜなら、付与にはapp[data]=dataが用いられ、そのうちのdataは上記でグローバル変数として定義されているためobjectである.正常に値を割り当てるには、app['data']=dataという引用符を付けなければなりません.
appを通過することもできる.data=dataが割り当てられます.
最後に、付与コードを正しく修正した後、
結果は次のとおりです.
まとめ:浅いコピー:拡張演算子、Object.assign深度コピー:JSON、およびforループ遍歴対値コピー
JSONはundefinedフィールドを無視します
付与問題:data['a']またはdata.a付与を行う.
今度はjsの配列についての操作を書く機会があります.
const data = {a:1,b:2,c:undefined}
const app = {data:{a:2,b:4},state:{x:true}}
app[data] = data
const backup1 = {...app}
const backup2 = Object.assign({},app)
const backup3 = JSON.parse(JSON.stringify(app))
console.log(app)
console.log(backup1)
console.log(backup2)
console.log(backup3)
出力結果は次のとおりです.
> Object { data: Object { a: 2, b: 4 }, state: Object { x: true }, [object Object]: Object { a: 1, b: 2, c: undefined } }
> Object { data: Object { a: 2, b: 4 }, state: Object { x: true }, [object Object]: Object { a: 1, b: 2, c: undefined } }
> Object { data: Object { a: 2, b: 4 }, state: Object { x: true }, [object Object]: Object { a: 1, b: 2, c: undefined } }
> Object { data: Object { a: 2, b: 4 }, state: Object { x: true }, [object Object]: Object { a: 1, b: 2 } }
見つかりましたか.dataフィールドは変更されず、最後に[object Object]フィールドが1つ増えました.なぜなら、付与にはapp[data]=dataが用いられ、そのうちのdataは上記でグローバル変数として定義されているためobjectである.正常に値を割り当てるには、app['data']=dataという引用符を付けなければなりません.
appを通過することもできる.data=dataが割り当てられます.
最後に、付与コードを正しく修正した後、
backup1['data']['a'] = 9
と修正対象の値を追加して、誰が浅いコピーなのか、誰が深いコピーなのかを見てみましょう.結果は次のとおりです.
> Object { data: Object { a: 9, b: 2, c: undefined }, state: Object { x: true } }
> Object { data: Object { a: 9, b: 2, c: undefined }, state: Object { x: true } }
> Object { data: Object { a: 9, b: 2, c: undefined }, state: Object { x: true } }
> Object { data: Object { a: 1, b: 2 }, state: Object { x: true } }
まとめ:浅いコピー:拡張演算子、Object.assign深度コピー:JSON、およびforループ遍歴対値コピー
JSONはundefinedフィールドを無視します
付与問題:data['a']またはdata.a付与を行う.
今度はjsの配列についての操作を書く機会があります.