JavaScriptのコピーメカニズム
変数への代入やオブジェクトのコピーが行われる際に、値の型によってコピー内容が異なる。
値の型には プリミティブ型 と オブジェクト型 の2つがある。
プリミティブ型の代入
プリミティブ型の変数は、値のコピーが保存されるため、値はそれぞれの変数に独立して保存される。
let name = "山田";
let newName = name;
newName = "田中";
console.log(name, newName); // output: 山田 田中
オブジェクト型の代入
オブジェクト型の変数は、オブジェクトの参照(メモリアドレス)が保存されるため、オブジェクトはコピーされず、それぞれの変数からオブジェクトが共有される。
const object = { name: "apple" };
const newObject = object;
newObject.name = "banana";
console.log(object); // output: {name: "banana"}
console.log(newObject); // output: {name: "banana"}
シャローコピーとディープコピー
オブジェクト型のコピーには、シャローコピー と ディープコピー の2種類がある。
- シャローコピー: 元のオブジェクトをコピーする際、オブジェクト内部のオブジェクトは参照がコピーされるため、オブジェクト内オブジェクトは共有される。
- ディープコピー: オブジェクト内部のオブジェクトも再帰的にコピーされるため、完全に独立したコピーが作成される。
シャローコピーの利用シーン:
-
パフォーマンスが重視される場合:
シャローコピーは、オブジェクトのコピーにおいて効率的で、メモリの使用量や処理速度が高速。大きなオブジェクトを扱う場合や、パフォーマンスが重要な場面でシャローコピーが選択される。 -
データの共有が必要な場合:
シャローコピーは、元のオブジェクトとコピー先が同じデータを共有するため、特定の変更が両方に反映される必要がある場合に選択される。複数の部分で同じデータを共有する必要がある場合に便利。
ディープコピーの利用シーン:
-
データの独立性が必要な場合:
コピー先が元のオブジェクトの変更に影響を受けてはいけない場合、または変更が元のオブジェクトに影響を与えてはいけない場合にディープコピーが選択される。 -
データの保存や変換が目的の場合:
元のオブジェクトから完全に独立したコピーを作成するため、そのコピーを変更しても元のデータに影響がない。特定の状態を保存したり、変換したりする際に利用する。
一般的にはシャローコピーが利用されている。データの独立性が必要な場合やデータの安全性が求められる場合には、ディープコピーを利用することもあるみたい。