浅い放射
オブジェクトのデフォルトはリファレンスタイプであることを知っておく必要があります.
浅い放射
:アドレス値のみコピーします.
サンプルコード)
var copyObject = function(target) {
var result = {};
for (var prop in target) {
result[prop] = target[prop];
}
return result;
}
->レプリカを交換するとオリジナルも一緒に交換され、オリジナルを交換するとレプリカも一緒に交換されます.
const user = {
name : 'goo',
urls : {
portfolio : 'https://github.com/seonggookang',
blog : 'https://blog.naver.com/ksung91889'
};
};
const user2 = copyObject(user);
user2.name = 'kang'; //(1)
console.log(user.name === user2.name); // false
user.urls.portfolio = 'http://portfolio.com';
console.log(user.urls.portfolio === user2.urls.portfolio); // true
user.urls.blog = 'http://blog.com';
console.log(user.urls.blog === user2.urls.blog); // true
(1)1行のコピーuser 2のname propertyを変更しても、元のuserのname propertyは変更されません.userオブジェクトに直接属するProperty(name)では、コピーされたデータは新しいものです.
さらなるURLの内部プロパティは、既存のデータを直接参照します.
そのため、オリジナルとコピーがずっと同じ現象が発生します.
ふかほうしゃ
:値にコピーします.
//객체의 깊은 복사를 수행하는 범용 함수
const copyObjectDeep =(target)=>{
const result = {};
if(typeof target === 'object' && target !== null){ //(1)
for(let prop in target){
result[prop] = copyObjectDeep(target[prop])
}
} else{
result = target //(2)
}
return result
};
// (1)번째 줄에서 target !== null 조건을 덧붙인 이유는 typeof 명령어가 null에 대해서도 'object'를 반환하기 때문이다. (자바스크립트 자체 버그이다.)
(1)ターゲットが1行目がオブジェクトである場合,copyObjectDeep関数を内部フローでループ呼び出している.オブジェクトでない場合は(2)targetを2行目のようにそのまま指定する.
この関数を使用してオブジェクトをコピーすると、元のオブジェクトとコピーはまったく異なるオブジェクトを参照するため、どのPropertyを変更しても他のオブジェクトには影響しません.
tip. 深度レプリケーションのシンプル化方法
const copyObjVioJSON = (target)=>{
return JSON.parse(JSON.stringify(target))
}
const obj ={
a:1,
b:{
c: null,
d:[1,2],
func1:function(){console.log(3);}
},
func2:function(){console.log(4);}
}
const obj2 = copyObjVioJSON(obj)
obj2.a=3;
obj2.b.c=4;
obj.b.d[1]=3;
console.log(obj) //{a:1, b:{c:null, d:[1,3], func1:f()},func2:f()}
console.log(obj2) //{a:3, b:{c:4, d:[1,2], func1:f()},func2:f()}
Reference
この問題について(浅い放射), 我々は、より多くの情報をここで見つけました https://velog.io/@ksung1889/얕은복사-깊은-복사テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol