参考:JavaScriptでのオブジェクトのコピー - Orinami Olatunji(@orinamio_)2017年10月23日
OBJ = LET { A: 1 、 B: 2 、 }; せコピー = OBJ; obj.a。= 5 ; にconsole.log(copy.a); // 結果 // 。A = 5; //はOBJの値を変更し、変数の値が変更されますコピー
多くの方法が、この記事では、唯一の3つの一般使用を選択し、それぞれの長所と短所を分析し、どのような状況下での使用は、その最高です、記事が言及しています。
1.ネイティブソリューション
最も簡単な方法は、新しい変数のサイクルをコピーすることです。李の場合:
関数のコピー(mainObj){ objcopyをせ = {}; // objcopyをはmainObjのコピーが保存されます キーましょう。 用(キーでmainObj){ objcopyを[キー] = mainObj [キー]。// objcopyをオブジェクトにコピー各プロパティを } 戻りobjcopyを。 } CONST mainObj = { : 2 、 B: 5 、 C:{ X: 7 、 Y: 4 、 } } にconsole.log(コピー(mainObj))。
短所:
Object.prototype方法とmainObj 1. objcopyを、我々は正確なコピーを必要とするとき、このアプローチは適用されません。通常、異なるものになります。
2.面倒で時間がかかり、面倒な、コードを再利用することはできません。
3.オブジェクト変数が元の型が含まれている場合は、コピーまたはサブインデックスは、新しいコピーを作成しないで、新しい変数に、この変数を配置します。
2.深さをコピーします
JSON変換をコピーするための変数。最初に元の文字列に可変とJSONに再組み立てが、これは別のコピーを生成します。
せOBJ = { : 1 、 B:{ C: 2 、 }、 } せNEWOBJ = JSON.parse(JSON.stringify(OBJ))。 obj.bc = 20 。 console.log(OBJ)。// {:1、B:{C:20}} にconsole.log(NEWOBJ)。// {:1、B:{C:2}}(新しいオブジェクト無傷!)
短所:
1.変数多くの時間は非常に時間がかかり、メモリです。
3. Object.assign()
使用例:
// 円形の物体 せOBJ = { : 'A' 、 B:{ C: 'C' 、 D: 'D' 、 }、 } obj.c = obj.b。 obj.e = obj.a。 obj.bc = obj.c。 obj.bd = obj.b。 obj.be = obj.bc。 newObj2せ = ({}、OBJ)Object.assign。 console.log(newObj2)。
これは、メソッドにパッケージ化することができます。
カプセル化された//方法
// 変数の新しいコピーを戻す // オブジェクトのAコピーを取得する 機能getNewObjectOf(SRC){ 戻りObject.assign({}、SRCを); }
短所:
1.これも浅いコピーである(コピーのみtop属性、根本的なプロパティがコピーされていません)。ディーププロパティは、元の変数とアドレスを共有し、インデックスを返します。(栗下記参照)
せOBJ = { : 1 、 B:{ C: 2 、 }、 } せNEWOBJ = Object.assign({}、OBJ)。 console.log(NEWOBJ)。// {:1、B:{C:2}} obj.a = 10 。 console.log(OBJ)。// {:10、B:{C:2}} にconsole.log(NEWOBJ)。// {:1、B:{C:2}} newObj.a = 20 。 console.log(OBJ)。// {:10、B:{C:2}} にconsole.log(NEWOBJ)。// {:20、B:{C:2}} newObj.bc = 30 。 にconsole.log(OBJ)。 // {A:10、B:{C:} 30} にconsole.log(NEWOBJ); // {A:20は、Bである:{C:30}} // 注:すべての変数*。30に等しいBC;上記参照理由を説明します。
結論:
オリジナルテキスト、他の多くの方法がありますが、最も有用な記事の抜粋わずか数。多くの変数があるように、第1のアプローチは、一般的に、使用されていない変数が一層のみ(例えば、構成情報JSON変数形式)が含まれている場合、第三のが最もあり、第二のアプローチをコピーする必要があり、その後、層なければなりません効率的。
メソッドは、指定された再カプセル化:
カプセル化された//方法
変数の新しいコピーを戻す// オブジェクトのAコピーを取得// 関数getNewObjectOf(SRC){ 戻りObject.assign({}、SRCを); }