심도 카피 개념 차이 및 심도 카피 코드 실현
2494 단어 js 방법
얕은 복사: 얕은 복사의 경우 기본 유형을 복사하면 부치와 같이 그 자체를 직접 복사한다.그러나 인용 유형을 복사하면 한 층만 복사되고 원 대상이 바뀌면 복사 대상도 바뀐다.
딥 카피: 딥 카피는 여러 층을 카피하고 끼워 넣은 대상도 카피한다. 카피를 저장할 새로운 메모리 주소를 개척하는 것과 같다.
딥 카피 구현:
첫 번째: ES6의 Object.assign () 방법
대상이 단지 한 층만 있는 것에 대해서는 진정한 깊은 복사를 실현할 수 없다.대상이 여러 층으로 되어 있어 이 방법을 사용할 수 없습니다.
Object.ssign({},obj1)은 먼저 빈 대상을 만들고 그 다음에
obj1
의 모든 속성을 복사한다는 뜻이기 때문에 obj2
는 obj1
와 똑같이 생겨서 이때 수정obj2.b
해도 영향을 주지 않는다obj1。
var obj1 = {name:'lily'};
var obj2 = Object.assign({},obj1);
obj2.name = 'bob';
console.log(obj1.name); //lily
console.log(obj2.name); //bob
두 번째: 대상을 문자열로 변환해서 돌아오기
JSON.stringify
로 대상을 문자열로 바꾸고 JSON.parse
로 문자열을 새로운 대상으로 바꿉니다. var obj = {
a:'hello',
b:{
name:'lily',
age:21
},
c:[1,2,3]
};
var obj1 = JSON.parse(JSON.stringify(obj));
obj1.a = 'world';
obj1.b = {
name:'bob',
age:15
};
obj1.c = [6,7,8];
console.log(obj.a);
console.log(obj.b);
console.log(obj.c);
console.log(obj1.a);
console.log(obj1.b);
console.log(obj1.c);
이때obj1의 모든 속성의 값을 바꿔도obj는 영향을 받지 않습니다.그러나 이런 방법은 함수function에 대해서는 무효다.
세 번째: 귀속 방법은 심층 복사를 실현한다.
지식 포인트:
1:3원 표현식:
표현식(expr1)?(expr2) : (expr3)
expr1에서 TRUE를 구할 때의 값은 expr2이고, expr1에서 FALSE를 구할 때의 값은 expr3이다.
2:hasOwnProperty(): 대상이 자신의 속성이 있는지 판단하는 데 사용
function deepClone(obj){
// ,
var newObj = Array.isArray(obj) ? [] : {};
// obj
//
if(typeof obj != 'object'){ // , obj,
return newObj = obj;
}
//
if(obj instanceof Array){ //
for(var i=0;i