const patty = {
name: 'Patty Rabbit',
email: '[email protected]', address: { town: 'Maple Town' },
};
const rolley = JSON.parse(JSON.stringify(patty)); rolley.name = 'Rolley Cocker';
rolley.email = '[email protected]'; rolley.address.town = 'Palm Town';
console.log(patty);
//{
// name:'PattyRabbit',
// email:'[email protected]',
// address:{town:'MapleTown'} ここが書き変わっている
//}
これを防ぐ方法が
const patty = {
name: 'Patty Rabbit',
email: '[email protected]', address: { town: 'Maple Town' },
};
const rolley = JSON.parse(JSON.stringify(patty));
rolley.name = 'Rolley Cocker';
rolley.email = '[email protected]';
rolley.address.town = 'Palm Town';
console.log(patty);
//{
// name:'PattyRabbit',
// email:'[email protected]',
// address:{town:'MapleTown'}
//}
「......これは、いったん文字列として展開してから JSON にパースし直してるんですか。強引です ね」 「うん、強引であるがゆえに弊害もあってね。プロパティに Date オブジェクトや関数、undefined とかが入ってた場合はうまく動かない。だからそれが絶対ないというのが保証できる場合限定の、 間に合わせテクニックだね」
「保証できない場合は?」 「Lodash104 っていう有名なユーティリティライブラリの cloneDeep()105 を使うとかかな。バンドル サイズの小ささや実行速度からrfdc106 というライブラリも最近はよく使われてるようだね。
まあコピーしたもののプロパティを書き換えるという場面がそこまでないので基本はシャローコ ピーをしつつ、それにどういう危険性があるかということを認識していればそれでいいよ」 「わかりました」