"const로 선언한 변수는 재할당 할 수 없다." 라는 것을 우리는 알고있다.
그렇다면 "const로 선언한 배열에 push와 pop이 불가능 해야 하는거 아니냐!" 할 수 있는데
이거는 "변수 타입"과 연관이 있다.
JS에는 두 가지의 변수 타입이 있다.
"Primitive Type"과 "Reference Type"이다.
Primitive Type은 우리가 익히 알고 있는 string, number, boolean, null, undefined, symbol, bigint이다.
이 Primitive Type은 변수에 할당될 때 값을 할당한다.
const a = 3;
이렇게 변수를 선언하면
이런식으로 a는 값 3을 직접 참조한다.
a = 2; // Cannot assign to 'a' because it is a constant.(2588)
이렇게 값을 변경하게 되면 메모리에 2가 추가로 생성되고 변수 a가 가리키는 작대기가 2로 바뀌어야 하는데 const로 선언된 변수는 재할당이 불가하기 때문에 에러가 발생한다.
Reference Type은 Object, Array, Function이 있다.
Reference Type은 변수에 할당될 때 메모리 주소를 참조한다.
const a = [];
이렇게 변수를 선언하면
이런식으로 a는 메모리의 주소값을 참조한다.
a = [1] // Cannot assign to 'a' because it is a constant.(2588)
이렇게 작성하면 [1]을 메모리에 새로 만들고 그 주소값을 a는 참조하려고 하기 때문에 const로 선언된 변수는 재할당이 불가해서 에러가 발생한다.
하지만 push와 pop은 메모리에 만들어진 배열 자체를 수정하는 것이기 때문에 참조하는 주소값이 바뀌지 않아서 사용할 수 있다.
즉, push와 pop은 재할당이 아니기 때문에 사용 가능하다
+⍺
Reference Type에서 ==과 === 같은 등호 연산자는 참조를 비교한다.
const a = [1];
const b = a;
console.log(a == b); // true
console.log(a === b); // true
// 메모리 주소가 같기 때문에 true
---
const c = [1];
const d = [1];
console.log(c == d); // false
console.log(c === d); // false
// 메모리 주소가 다르기 때문에 false