원시값 과 참조값
원시값 (Primitive value) | 참조값 (Reference value) | |
데이터 타입 | 문자, 숫자, boolean, null, undefined, symbol | 배열, 객체, 클래스, 함수 |
값의 변경 | 변경 불가능한 값 | 변경 가능한 값 |
저장 형태 | 변수에 지정된 값을 직접 저장 | 변수에 값이 저장된 메모리의 주소를 저장 |
여기서 변경 불가능 하다는 것은 원시값 자체를 변경하지 못 한다는 것 변수의 값은 변경가능
원시값을 할당 받은 변수의 값 변경 예시
let test = 1;
let changeValue = test;
test = 4
console.log(test) // 4
console.log(changeValue) // 1
→ 변수의 메모리에 저장된 값을 변경
참조값을 할당 받은 변수의 값 변경 예시
let arr = [1,2,3,4];
let result = arr
arr.push(5)
console.log(arr) // [1,2,3,4,5]
console.log(result) // [1,2,3,4,5]
→ 배열이 저장된 메모리주소를 변수 arr 에 저장
→ result 에도 메모리 주소를 저장
→ arr.push(5) 는 arr 이 가르키는 메모리주소에 있는 값을 변경
→ result 와 arr 이 가르키는 메모리주소가 같으므로 같은 값을 출력
얕은 복사 (shallow copy) 와 깊은 복사 (deep copy)
객체의 얕은 복사 = 복사본이 원본 객체와 같은 메모리 주소를 참조하는 복사
얕은 복사예시
// 배열
const a = [1, {name: "test"}]
const b = Array.from(a)
console.log(a === b) // false
console.log(a[0] === b[0]) // true
console.log(a[1].name === b[1].name) // true
// 값을 변경
a[1].name = "change"
a[0] = 4
/*
a 의 첫 번째 값이 원시값이므로 b에는 반영이 안되었지만
a 의 두 번째 값은 참조값이여서 b에도 반영됨
*/
console.log(a) // [4, {name: "change"}]
console.log(b) // [1, {name: "change"}]
얕은 복사는 객체와 같은 타입의 값은 메모리의 주소를 복사하므로 위와 같이 변경사항이 반영됨
깊은 복사 = 복사본이 원본과 같은 메모리주소를 참조(공유)하지 않는 복사
깊은 복사 예시
const aList = ["noodles", { list: ["eggs", "flour", "water"] }];
const aListDeepCopy = JSON.parse(JSON.stringify(aList));
aList[1].list = ["rice flour", "water"];
/*
aList 의 두 번째 요소와 aListDeepCopy 의 두 번째 요소가
같은 메모리주소를 공유하지 않으므로 변경된 사항이 반영이 안됨
*/
console.log(aList) // ["noodles", { list: ["rice flour", "water"] }]
console.log(aListDeepCopy) // ["noodles", { list: ["eggs", "flour", "water"] }]
참고 자료
'프로그래밍 > JavaScript' 카테고리의 다른 글
[ JS ] 프라미스와 async / await : promise (0) | 2024.06.04 |
---|---|
[ JS ] 프라미스와 async / await : 콜백 (0) | 2024.06.03 |
[ JS ] 불변객체 immutable object (1) | 2024.05.11 |
[ JS ] Promise.allSettled 사용하는 이유 (0) | 2024.05.06 |
[ JS ] Promise.all() 사용하는 이유 (0) | 2024.05.06 |