본문 바로가기

JavaScript

[JavaScript] 얕은 복사(Shallow copy)와 깊은 복사(Deep copy)

728x90
반응형

얕은 복사(Shallow copy)

객체를 복사할 경우 복사된 값이 같은 참조를 가리키고 있는 것을 말한다.

let person = [{ name: ["Alex", "John", "Rose"] }];
let copy = person.slice();
//얕은 복사 
console.log(person === copy); // false 기존 객체와 복사한 객체의 주소가 서로 다르다.
console.log(person[0].name === copy[0].name); // true 기존 객체의 0번째 인덱스 객체의 주소와 복사한 객체의 0인덱스 객체의 주소는 같다.

person 객체를 얕은 복사로 복사를 할 경우 복사된 값이 같은 주소를 가리키고 있다. 따라서 우리가 기존 요소의 공유 속성 값을 선택적으로 변경하게 되면 기존 객체의 값도 변경되게 된다.

copy[0].name = ["Alex", "John", "Herry"]; // 공유 속성 값을 선택적으로 변경
console.log(person[0]); // [ 'Alex', 'John', 'Herry' ]

위의 코드처럼 얕은 복사의 경우 복사된 copy객체의 값을 변경을 했음에도 기존 person객체의 값도 같이 변경이 된다.

copy[0] = { name: ["Alex", "John", "Herry"] }; // 새로운 객체를 재할당(주소가 다르다)
console.log(person[0]); // [ 'Alex', 'John', 'Rose' ] 기존 객체의 값이 변경되지 않음
console.log(copy[0]); // [ 'Alex', 'John', 'Herry' ] 복사된 객체의 값만 새로 할당됨

얕은 복사를 하는 명령어

... , Array.prototype.concat(), Array.prototype.slice(), Array.from(), Object.assign(), Object.create()

 

깊은 복사(Deep copy)

깊은 복사는 원본 개체의 참조와 동일한 참조를 공유하지 않는 복사본을 말한다.

JSON.stringify() JavaScript 개체 또는 값을 JSON 문자열로 변환한다.

JSON.parse() JSON 문자열을 구문 분석하여 문자열에서 설명하는 JavaScript 값 또는 개체를 구성한다.

let person = ["age", { name: ["Alex", "John", "Rose"] }];
let copy = JSON.parse(JSON.stringify(person));

copy[1].name = ["Alex", "John", "Herry"]; // 공유 속성 값을 선택적으로 변경을 해도
console.log(person[1].name); // [ 'Alex', 'John', 'Rose' ] 기존 객체의 값은 그대로 이다.

깊은 복사를 하는 명령어

JSON.stringify() , JSON.parse(), structuredClone()

728x90
반응형

'JavaScript' 카테고리의 다른 글

[JavaScript] 클래스와 인스턴스  (0) 2022.05.25
[JavaScript]고차함수  (0) 2022.05.24
[JavaScript] ES6의 주요 문법  (0) 2022.05.13
[JavaScript] 클로저  (0) 2022.05.13
[JavaScript] 스코프  (0) 2022.05.13