JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

【JavaScript】コピーしたオブジェクトを更新すると元のオブジェクトも変わる?Object.assign()の挙動を解説

結論:元の(親の)オブジェクトは更新されません

結論からお伝えすると、Object.assign()で作成したコピー先のオブジェクトを更新しても、元のオブジェクトは更新されません。
これは、Object.assign()が第1引数に指定した空のオブジェクト{}に対して、各オブジェクトのプロパティをコピーし、まったく別の新しいオブジェクトを生成するためです。

コード例

var firstObject = { name: 'John' };
var secondObject = { name: 'Carol' };
console.log("マージ前=");
console.log(firstObject);
var afterMerging = Object.assign({}, firstObject, secondObject);
afterMerging.name = 'Smith';
console.log("マージ後=");
console.log(firstObject);

上記のプログラムを実行するには、ターミナルから以下のコマンドを使用します。

node fileName.js

実行結果

ここでは、ファイル名を demo131.js として実行しています。実行すると、次のような出力が得られます。

PS C:\Users\Amit\JavaScript-code> node demo131.js
マージ前=
{ name: 'John' }
マージ後=
{ name: 'John' }

結果の解説

出力結果に注目してください。コピー先の afterMerging.name'Smith' に書き換えても、firstObject{ name: 'John' } のまま一切変化していません。
これは、Object.assign({}, firstObject, secondObject) の時点ですでに独立した新しいオブジェクトが作られているためです。つまり、コピー先への変更が元のオブジェクトに波及することはありません。

注意点:浅いコピー(シャローコピー)であること

ただし、Object.assign() によるコピーは「浅いコピー(シャローコピー)」である点に注意が必要です。
オブジェクトの中に入れ子になったオブジェクト(ネストしたオブジェクト)がある場合、その内部オブジェクトへの参照は元のオブジェクトと共有されます。そのため、ネストされた内部の値を変更すると、元のオブジェクトにも影響が及ぶ可能性があります。

完全に独立したディープコピーが必要な場合は、structuredClone() や JSON を利用した方法などの使用を検討しましょう。

  1. JavaScriptで配列内オブジェクトのプロパティ名を置き換える方法

    JavaScriptでオブジェクト配列のプロパティ名を置き換える方法 JavaScriptでは、map()メソッドを活用することで、配列に含まれる各オブジェクトのプロパティ名を別の名前に簡単に置き換えることができます。map()は元の配列を変更せずに新しい配列を生成するため、安全かつ効率的なデータ変換処理に適しています。 以下は、オブジェクト配列のプロパティ名 name を fullName に置き換えるサンプルコードです。 サンプルコード <!DOCTYPE html> <html lang="en"> <head> <meta

  2. JavaScriptのImage()オブジェクトとは?使い方とサンプルコードを解説

    JavaScriptにおけるImage()オブジェクトは、HTMLの<img>要素を表すオブジェクトです。このオブジェクトを使うことで、JavaScriptから動的に画像を生成し、Webページに追加することができます。Image()コンストラクタには、引数として画像の幅と高さをピクセル単位で指定できます。また、生成した画像オブジェクトのsrcプロパティに画像のURLを設定することで、画像を読み込むことが可能です。Image()オブジェクトの基本的な使い方以下は、JavaScriptでImage()オブジェクトを使用するサンプルコードです。コード例<!DOCTYPE html&