JavaScript Primer 객체 # 깊이 복사 예 이해
5420 단어 신입 교육JavaScript
다음은 JS Primer의 설명을 참조하십시오.
반대로 귀속 복사와 복사 속성 값은 깊이 복사라고 부른다.deepcopy는 shallowcopy로 귀속할 수 있습니다.다음 코드는 shallowClone을 사용하여 deepClone을 구현합니다.
따라서 자바스크립트 내장 방법은 일반적으로 얕은 (shallow) 실현만 제공하고 깊은 (deep) 실현은 제공하지 않는다.이것은 언어가 최소한의 기능을 제공했고 더욱 복잡한 기능은 사용자 측에서 실현된 형식이기 때문이다.
// 引数の`obj`を浅く複製したオブジェクトを返す
const shallowClone = (obj) => { //(5)
return Object.assign({}, obj);
};
// (3)
// 引数の`obj`を深く複製したオブジェクトを返す
function deepClone(obj) {
//(4)
const newObj = shallowClone(obj); // => {level: 1, nest: {level: 2}}
// プロパティがオブジェクト型であるなら、再帰的に複製する
// (6)
Object.keys(newObj) //引数内のオブジェクトのキー(左側)を一つずつ抜き出してくる(forEachに似てる?)
.filter(k => typeof newObj[k] === "object") // (7)
.forEach(k => newObj[k] = deepClone(newObj[k])); // (8)
return newObj;
}
//(1)
const obj = {
level: 1,
nest: {
level: 2
}
};
//(2)
const cloneObj = deepClone(obj);
// (9)`nest`オブジェクトも再帰的に複製されている
console.log(cloneObj.nest === obj.nest); // => false
다음은 실제 절차와 동작이 다르다고 생각하지만 초보자의 이해를 위해 절차를 정리해 본다.{}
으로 통합하고 되돌려줍니다.함수 표현식에서 변수에 대한 함수로 newObj의 키를 하나하나 검사하고 해당하는 속성으로만 새로운 그룹을 만들고 되돌려줍니다.(→if문처럼!)키의 데이터 형식이 "object"("예?"인지 확인하는 내용입니다.이렇게 생각하는 입문자는 아래 그림 1)을 참조한다.즉, 정렬만 가능합니다
{level: 2}
.k
의 속성에 대입합니다.{level: 2}
에 대해 다시 x-y 처리를 진행한다.newObj로 돌아갑니다.nest
와 복제된 clone Obj의 키nest
를 비교하여false가 되기 때문에 복제의 대상임을 알 수 있다.Array.filter
여기서 마치겠습니다.
그나저나 구가의 복사라면 프로그램의 코드라도 Clone이 아니라 복사였으면 좋겠다고 생각하는 건 나뿐인가.
Reference
이 문제에 관하여(JavaScript Primer 객체 # 깊이 복사 예 이해), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kakudaisuke/items/00c8cadbaa498500fe85텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)