[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);