[JS/Node]浅いレプリケーション、深いレプリケーション
9108 ワード
リファレンスコード
オブジェクト
obj
には、オブジェクトの値を持つc
が含まれています.let obj = {
a: 1,
b: 2,
c: {
x: 3,
y: 4
}
}
単純コピー(=、代入演算子)
ソースオブジェクトにアドレス値を割り当てる動作
2つのオブジェクトは互いに変化を共有します.
let obj = {
a: 1,
b: 2,
c: {
x: 3,
y: 4
}
}
let copyObj = obj
浅いレプリケーション
元のオブジェクトのプロパティ値を正確に新しいオブジェクトにコピーします.
プロパティの値が「オブジェクト」の場合。
オブジェクトのアドレス値のコピー
コピーされたオブジェクトには元のオブジェクトと同じ属性と値があり、アドレスがコピーされた属性は同じ値を共有します.
コピーしたオブジェクトが変更されると、元のオブジェクトの値に影響します.
1. Object.assign({}, obj)
Object.assign({}, obj)
let obj = {
a: 1,
b: 2,
c: {
x: 3,
y: 4
}
}
let copyObj = Object.assign({}, obj);
2.拡散演算子(拡散演算子)
Spread演算子のレプリケーションを使用して、浅い(浅い)レプリケーションを実行します.
配列にオブジェクトがある場合は、オブジェクト自体はコピーされず、元の値が参照されます.
したがって、元のアレイのオブジェクトを変更すると、新しいアレイのオブジェクト値も変更されます.
ディープコピー(deepcopy)
値自体のコピー
プロパティの値が「オブジェクト」の場合。
新しいメモリ容量.
コピーしたオブジェクトの値オブジェクトが変更された場合、そのオブジェクトの値には影響しません.
loop=>再帰
loop를 재귀로 변경
let obj = {
a: 1,
b: 2,
c: {
x: 3,
y: 4
}
}
function deepCopy(obj) {
if (obj === null || typeof(obj) !== "object") {
return obj;
}
let copy = {};
for(let key in obj) {
copy[key] = deepCopy(obj[key]);
}
return copy;
}
// 출처: https://mygumi.tistory.com/322 [마이구미의 HelloWorld]
JSON
JSON
let obj = {
a: 1,
b: 2,
c: {
x: 3,
y: 4
}
}
let copyObj = JSON.parse(JSON.stringify(obj));
// 출처: https://mygumi.tistory.com/322 [마이구미의 HelloWorld]
ライブラリ(jQuery,lodash...)
jQuery
let copyObj = $.extend(true, {}, obj);
lodash
let copyObj = _.cloneDeep(obj);
Reference
この問題について([JS/Node]浅いレプリケーション、深いレプリケーション), 我々は、より多くの情報をここで見つけました https://velog.io/@djdu4496/얕은-복사-vs-깊은-복사テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol