シャローコピー(アドレスのコピー)

シャローコピーは、参照元のオブジェクトとコピー先のオブジェクトが

どちらも同じメモリを参照している状態のことをいう。

シャローコピーには、以下の関数を使用

Object.assign

'use strict'

// person1オブジェクトの作成
const person1 = {
name: "sample3",
age: 24,
size: {
height: 193,
weight: 100
},
getBmi: function() {
let bmi = this.size.weight / Math.pow(this.size.height/100, 2);
return bmi.toFixed(2);
}
};

// person1をperson2にシャローコピー
const person2 = Object.assign({}, person1); // Object.assignを利用
person2.size.height = 180;
console.log(person2.size.height);
// console => 180
console.log(person1.size.height);
// console => 180

// BMIが180cm,100kgとして計算される
let bmi = person1.getBmi();
console.log(bmi);
// console => 30.86

Object.assign({}, person1)の代わりに

スプレッド演算子によるコピーでも可。

const person2 = {...person1};


ディープコピー(構造と値のコピー)

ディープコピーとは、オブジェクトのみのコピーではなく、

オブジェクトとメモリ上のデータの両方をコピーする。

コピー元の値を変更してもコピー先の値は変更されない。

ディープコピーには、以下のライブラリを使用

LoDash

'use strict'

// person3オブジェクトの作成
const person3 = {
name: 'sample3',
age : 26 ,
size: {
height: 193,
weight: 100
},
getBmi: function() {
let bmi = this.size.weight / Math.pow(this.size.height/100, 2);
return bmi.toFixed(2);
}
};

// person3をperson4にディープコピー
const person4 = _.cloneDeep(person3); // Lodash.jsを利用
person4.size.height = 180;
console.log(person4.size.height);
// console => 180
console.log(person3.size.height);
// console => 193

// BMIが193cm,100kgとして計算される
let bmi = person3.getBmi();
console.log(bmi);
// console => 26.85