0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Objectのコピーについて(Javascript)

Last updated at Posted at 2022-02-18

javascrptのオブジェクトは単純な代入だと参照が渡されてしまいプロパティに対する編集が共有されてしまう。

const hoge = { name: 'hoge'};
let hogehoge = hoge;

hogehoge.name = 'hogehoge';

console.log(hoge)//{name: 'hogehoge'}が表示される

1階層のオブジェクトであれば新規の配列を作成するmapを使い、参照を共有しないオブジェクトを取得できる。

const hoge = { name: 'hoge'};
let hogehoge = [hoge].map( val => ({...val}))[0];

hogehoge.name = 'hogehoge';

console.log(hoge, hogehoge)//{name: 'hoge'} {name: 'hogehoge'}が表示される

しかしオブジェクトがプロパティとしてオブジェクトを持っている場合、ネストされたオブジェクトの参照はやはり共有されてしまう。

const hoge = { id: 1 , data: { name: "hoge" } };
let hogehoge = [hoge].map( val => ({...val}))[0];

hogehoge.id = 999;
hogehoge.data.name = 'hogehoge';

console.log(hoge, hogehoge);
/*
{id: 1, data:{name: 'hogehoge'} } 
{id: 999, data:{name: 'hogehoge'} }が表示される。
idはそれぞれ独自の値を保持しているがdata.nameの値は共有されている
*/

プロパティとして配列を持っている場合も同じ挙動をとる。

const hoge = { id: 1 , arr: ['hoge'] };
let hogehoge = [hoge].map( val => ({...val}))[0];

hogehoge.id = 999;
hogehoge.arr[0] = 'hogehoge';

console.log(hoge, hogehoge)
/*
{id: 1, arr:['hogehoge'] } 
{id: 999, arr:['hogehoge'] }が表示される。
idはそれぞれ独自の値を保持しているがdata.arの値は共有されている
*/
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?