[JavaScript] 섀시 복사 및 깊이 이해
16627 단어 JavaScripttech
개시하다
Safari15.4가 나왔기 때문에 모든 현대 브라우저는
structuredClone()
를 사용하여 깊이 있게 복제할 수 있다.회사 내에서도 화제가 됐지만, 최초의 심도 있는 복제는 무엇일까...?그래서 간단한 조사 총결산.
또 원판 복사본도 관련된다.
JavaScript의 데이터 유형
섀시 복사·딥 복사를 말하기 전에 자바스크립트에 대한 데이터를 먼저 말하세요.
JavaScript는 원본형과 객체형 두 종류로 나뉜다.
원래 유형
진위값이나 수치 등 기본값의 유형을 가리킨다.
원시 유형은 한 번 제작하면 수치 자체를 바꿀 수 없는 동음판 특성을 가지고 있다.
원래 유형
대상
원본 형식이 아닌 대상이나 그룹 등을 대상이라고 부른다.
제작 후에도 수치를 변경할 수 있기 때문에 정음판의 특성을 가지고 있다.
객체는 참조를 통해 저장되거나 복사됩니다.
객체의 변수를 지정하면 값이 아닌 객체의 스토리지 주소가 저장됩니다.
객체 및 배열과 같은 참조 유형의 데이터만 섀시 복제 및 깊이 복제 필요
대상
원본 유형 복사
원본 유형의 복사본은 생성되는 동안 메모리에 새 값을 분배합니다.
모든 메모리에 값이 있기 때문에 a를 b에 대입한 후 a의 값 b를 변경해도 바뀌지 않습니다.
원래 유형은 값으로 복사됩니다.
let a = 100;
let b = a;
a = 200;
console.log(a); // 200
console.log(b); // 100
객체 복사
객체의 복사본은 원래 유형과 달리 새 객체에 대한 참조 전송을 작성하지 않습니다.
변수
person
와 newPerson
는 메모리의 동일한 데이터를 확인합니다.나는 같은 데이터에 별명을 붙인 것을 이해했다.const person = {name: "Tom"};
const newPerson = user;
person.name = "Bob";
console.log(person); // {name: "Bob"}
console.log(newPerson); // {name: "Bob"}
참조된 데이터가 같기 때문에 값을 변경한 후에 값이 각각 변한다.다만 실제 대상의 값이 바뀌면 곤란한 경우가 많다.
따라서 원판 복사와 심판 복사가 필요하다.
원판 복사, 심판 복사
복사된 소스와 복사된 목적지의 참조 깊이를 기준으로 하는 호칭입니다.
슬라이드 사본
추적기 복사(shallow copy)는 이름과 같이 복사된 원본의 한 층만 복사합니다.
메모리에서 대상의 한 층을 복사하고, 중첩된 대상은 인용을 통해 전달된다.
밑줄 복사는
Object.assign
또는 스프레드시트 구조를 사용합니다.const person = {
firstname: "Alex",
lastname: "Turner",
birth: {
year: 1986,
month: 1,
date: 6
}
}
const newPerson = { ...person };
newPerson.firstname = "Miles";
newPerson.lastname = "Kane";
console.log(person); // {firstname: "Alex", lastname: "Turner", birth{...}}
console.log(newPerson); // {firstname: "Miles", lastname: "Kane", birth{...}}
레이어 1은 섀시 복사를 통해 복사되고 레이어 2의 객체는 복사된 소스이며 복사된 대상은 같은 메모리를 참조하므로 값이 변경되면 다른 레이어도 변경됩니다.const person = {
// 省略
}
const newPerson = { ...person };
newPerson.firstname = "Miles";
newPerson.lastname = "Kane";
newPerson.birth.month = 3;
newPerson.birth.date = 17;
console.log(person);
// {firstname: 省略, birth: {year: 1986, month: 3, date: 17}}
console.log(newPerson);
// {firstname: 省略, birth: {year: 1986, month: 3, date: 17}}
깊이 복사
깊이 복사는 참조 값이 아닌 복사 값을 복사합니다.
스토리지에 저장된 데이터를 모두 복제합니다.
깊이 있는 복제 수행
1. JSON.parse(jSON.stringify(obj))
'보글보글'은 자주 나오는 방법이다.
const person = {
firstname: "Alex",
lastname: "Turner",
birth: {
year: 1986,
month: 1,
date: 6
}
}
const newPerson = JSON.parse(JSON.stringify(person));
newPerson.birth.month = 3;
newPerson.birth.date = 17;
console.log(person);
// {..., birth: {year: 1986, month: 1, date: 6}}
console.log(newPerson);
// {..., birth: {year: 1986, month: 3, date: 17}}
문제가 발생할 수 있으므로 주의해야 합니다.2. lodash의clonneDeep
두 번째는lodash를 사용합니다.
사전에 설치해야 하지만 간단하게 사용할 수 있다.
import _ from "lodash";
const person = {
// 省略
};
const newPerson = _.cloneDeep(person);
newPerson.birth.month = 3;
newPerson.birth.date = 17;
console.log(person);
// {..., birth: {year: 1986, month: 1, date: 6}}
console.log(newPerson);
// {..., birth: {year: 1986, month: 3, date: 17}}
3. structuredClone()
세 번째는 이번 조사의 디스크 복사와 깊이 복사의 계기 함수다.
지금 복사할 수 있는 유형이 아래에 적혀 있습니다.함수는 안 될 것 같습니다.
const person = {
// 省略
};
const newPerson = structuredClone(person);
newPerson.birth.month = 3;
newPerson.birth.date = 17;
console.log(person);
// {..., birth: {year: 1986, month: 1, date: 6}}
console.log(newPerson);
// {..., birth: {year: 1986, month: 3, date: 17}}
총결산
원판 복사와 깊이 복사를 총결하였다.
실제 업무에서 샤론 사본을 자주 사용하지만, 이번 조사의 내용을 미리 알지 못하면 반할 것 같다.
슬라이드 사본
객체의 첫 번째 레이어를 복사합니다.2층이 있는 경우 참고 전달이 된다.
Object.assign
또는 스프레드시트 구조를 사용할 수 있습니다.깊이 복사
객체 값 자체를 복사합니다.깊이 있게 복사하는 방법에 따라 문제가 있을 수 있으니 주의하세요.
대상의 속성에 함수
structuredClone()
가 없으면 함수 등을 포함하는 깊이 있는 복제를 하려면 lodash
의cloneDeep
를 사용하는 것이 좋다.참고 자료
Reference
이 문제에 관하여([JavaScript] 섀시 복사 및 깊이 이해), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/takuya_naganuma/articles/8c4a7e68cd58e6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)