메모리의 영역이 변하지 않는다는 것을 의미
타입은 call Stack에 저장되고 참조타입은 heap memeory에 저장된다
let a = 10
let b = 20
a = 20
b = 30
// 변수를 재 할당하면 초기 값은 garbage collector의 대상이 되고 새로운 값으로 할당된다.
// 메모리 힙의 영역은 변하지 않는데, 이를 `불변하다`라고 한다
const c = [1, 2, 3]
const d = [4, 5, 6]
c.push(100)
b.push(200)
// 참조타입 변수를 재할당하면 memory heap이 변한다 이를 `가변적이다`라고 한다.
call stack 영역을 비교하는 것을
얕은비교
, memory heap의 영역을 비교하는 것을깊은비교
라고 한다.
const one = {a: 20, b: "asd"}
const two = {a: 20, b: "asd"}
cosnole.log(one === two) // false
console.log(JSON.stringify(one) === JSON.stringify(two)) // true
계산 리소스를 줄이기 위해 얕은 비교를 실행 -> 콜스택의 값이 다르면 리랜더링
그래서 setState의 값이 원시타입이라면 리랜더링이 발생하지만 참조타입이라면 리랜더링이 발생하지 않는다
structuredClone()를 이용하면 깊은 복사 가능
const a = [
[1,2,3]
]
const copiedArray = [...a]
a===copiedArray //false
a[0] === copiedArray[0] // true
const deepCompare = structuredClone(a)
a===copiedArray //false
deepCompare[0] === a[0] // false