[Javasript] const array는 왜 push(), pop()이 가능할까?

gongyoon·2022년 6월 28일
0

const 는 상수를 정의한다는 의미로 재할당, 재선언이 불가능하다.

const a = [];
a.push('x');	// works

const b = [];
b = ['x'];	// error 재할당

const b = ['x'];	// error 재선언

그렇지만 위와 같이 const로 선언한 array가 push(), pop()은 가능하다. push 와 pop 은 재할당이 아닌걸까?

참고 - 나무위키 [https://namu.wiki/w/JavaScript#s-4]

객체의 경우 상수로 선언해도 메모리값만 상수일 뿐 객체 안의 내용은 변경이 가능하다. 즉 객체가 저장된 공간을 가리키는 정보만 상수일뿐 그 객체의 정보 자체는 변경이 가능하다. 이런 이유로 JavaScript에서 객체는 변수로 선언할 이유가 없으며 거의 모든 케이스에서 상수로 선언하는게 일반적이다. 또 이렇게 상수로 선언된 객체의 Immutability를 보장하기 위해 여러 테크닉이 쓰이게 되는데 주로 ES6에서 도입된 Spread Operator를 사용하는 것이 일반적이다. 이렇게 객체를 복사하여 사용할 때도 Deep clone하지 않으면 의도치 않게 원본 객체가 변경되어버리기 때문에 많은 주의가 필요하다.

객체 정보가 담긴 공간을 가리키는 레퍼런스만 상수이고 객체는 변경이 가능했던 것이다.
그래서 push(), pop()은 상수인 레퍼런스를 바꾸지 않고 메모리(객체가 저장된 정보)가 변경할 수 있으니 가능하다.

마치며

객체들을 let이 아닌 const 선언하는 것에 주의하며 레퍼런스의 특징으로 객체 접근시 원본 객체가 변경되지 않게 spread operator(...) 등으로 deep clone을 이용하도록 하자.

profile
공부하며 성장하는 사람이 되고 싶은 개발자.

0개의 댓글