ES6 업데이트 이후 추가된
let과 const로 인해 우리는 더 이상 변수를 선언할 때
var를 사용하지 않고, let과 const를 사용하게 되었다.
그래서 앞으론 호이스팅에 대한 걱정은 하지 않게 되었으며, 블록 범위(block-scope)로 변수가 생성되며, 재할당도 불가능하게 되었다.
let과 const의 차이는 mutable, immutable의 차이인데
최대한 const를 많이 사용하는 것을 권장한다.
1) 변수를 사용하는 것은 버그를 유발한다.
예상치 못한 변수의 변경으로 많은 버그가 발생하기 때문이다.
2) 읽기가 편해진다.
코드의 흐름을 편하게 따라가기 위해서는 변하는 부분이 적어야하기 때문이다.
꼭 그런 것만은 아니다.
const 변수에 할당된 값은 절대로 바뀌지 않는다.
재할당만 막는 걸 보장한다고 되어있지만, 재할당을 막는 게 곧 값을 못 바꾼다는 얘기는 아니다.
다들 아시다시피 객체(Object)는 변수에 할당될 때 Object자체가 할당되는 게 아니라
Object의 주소가 할당된다. 이것은 기본사항이다.
그렇기 때문에 {} === {}는 거짓이다.
const변수에 Object를 할당하면 당연히 Object를 가리키는 주소값이 할당되는데
이 주소 값은 불변이고, 상수이다.
그러나 이 Object에 프로퍼티를 추가하거나 변경하는 것은 가능하다.
이것은 당연한데 이 행위가 Object의 주소값은 전혀 건들이지 않기 때문이다.
그래서 const로 선언된 Object의 경우 push를 사용해서 프로퍼티를 추가하는 것도,
프로퍼티의 값을 변경하는 것도 가능하다보니
const value는 변경이 가능하다는 말이 나온 것이다.
그렇지만 Object의 내부까지 불변값으로 고정시키기 위해서는
Object.freeze를 사용하여 단기적으로 해결하거나
페이스북의 Immutable을 사용하는 것이 좋다.
그리고 TypeScript에서는 readonly 프로퍼티를 이용하면 불변 객체를 만들 수 있다.