반응형
가변 객체
말 그대로 변할 수 있는 객체입니다.
let obj1 = { c: 10, d: 20 };
let obj2 = obj1;
obj2.c = 5;
console.log(obj1); // { c: 5, d: 20 };
console.log(obj2); // { c: 5, d: 20 };
arr1는 값을 가지고 있는게 아니라 값이 담긴 주소값을 가지고 있습니다.
따라서 arr2는 arr1이 가리키는 주소값을 복제한거고 그래서 둘이 같이 변하는 것입니다.
하지만 우리는 개발할 때 원본값이 변하면 안되는 경우가 있습니다. 예를 들자면
1. 쇼핑몰 목록에서 필터를 적용한 후 해제 했을 때
등등이 있습니다. 그럼 이제 불변 객체를 만드는 방법에 대해서 알아봅시다.
불변 객체
자바스크립트에서 복제된 객체의 값을 변경했을 때 원본의 값도 변경되는 경우는 프로퍼티로 변경했을 때입니다.
프로퍼티로 변경은 위 가변 객체에서 한 방법을 말 합니다.
불변 객체로 만드는 방법은 아예 새로운 객체를 생성하는 것입니다.
원본의 객체의 값을 가져와서 새로운 객체를 생성하면 불변 객체를 만들 수 있습니다.
let obj1 = { c: 10, d: 20 };
const copyObject = (target) => {
let result = {};
for(let prop in target) {
result[prop] = target[prop];
// object도 배열처럼 변수명['프로퍼티명'] 하면 해당 값이 출력된다.
}
return result;
};
let obj2 = copyObject(obj1);
obj2.c = 40;
console.log(obj1); //{ c: 10, d: 20 }
console.log(obj2); //{ c: 40, d: 20 }
이렇게 하면 보기엔 같은 값을 가지고 있어서 똑같아 보이지만, 메모리 상에선 obj2는 다른 객체의 주소값을 가지고 있다.
객체를 새로 생성했기 때문이다.
개인적으로 궁금해서 객체 말고도 배열도 불변 배열을 만들 수 있는지 코드를 만들어 보았다.
// 배열의 얕은 복사
let arr1 = [1, 2, 3];
let arr2 = arr1;
arr2[0] = 5;
console.log(arr1); //[5, 2, 3]
console.log(arr2); //[5, 2, 3]
// 배열의 깊은 복사
let arr3 = [6, 7, 8];
let arr4 = [...arr3];
arr4[0] = 9;
console.log(arr3); //[6, 7, 8]
console.log(arr4); //[9, 7, 8]
... 문법으로 값은 같지만 새로운 배열을 만들어서 원본 배열이 변경되지 않게 만들 수 있다는 걸 알게 되었다.
(... 문법은 배열의 값만 출력할 수 있는 문법이다.)
728x90
'JavaScript' 카테고리의 다른 글
this란 무엇인가 (0) | 2022.12.06 |
---|---|
객체 정렬하기 (0) | 2022.12.01 |
자바스크립트 데이터 타입 (0) | 2022.11.28 |
백준 입출력 문제 풀기 (0) | 2022.11.25 |
소수점 2자리 이하 만들기 (0) | 2022.02.14 |