let과 const

ES
비고
let : 변수, const : 상수
Tags
data-type
let
const

let, const 공통

  • 선언된 해당 블록 스코프 내에서만 사용 가능.
  • 동일한 변수명으로 선언할 수 없다. (스코프가 다르다면 가능)
    • var는 호이스팅 하면서 마지막에 있는 것만 남겨두고 앞에 것을 무시했음.
      • notion image

let

재할당 가능한 변수

특징

  • 선언만 해놓고 값 할당은 뒤에서 해도됨.
  • 값을 계속 바꿔도 됨.
let a; a = 2; a = 3; a = 5; let b = 5; b = 3; b = 6;
 

const

constant variable. 상수를 담을 변수

특징

  • 선언과 동시에 반드시 초기값을 줘야한다.
  • 값을 한번 할당하면 재할당 할 수 없다.
const a = 3; a =2 ; // Assignment to constant variable
 

 

주의 사항

constlet과 관련하여 헷갈릴 법한 상황들을 나열해 보자.

경우1

const 변수에 오브젝트를 할당하는 경우, 오브젝트 내의 값도 변경할 수 없을까?
⇒ 오브젝트에 대한 ref가 const에 담기는 것이지 오브젝트 자체가 const는 아님.
💡
내부 값들 까지 변하지 않도록 하는 것을 freeze 라고 한다.
⇒ 따라서 const 변수에 다른 오브젝트를 넣을 순 없지만, 기존 오브젝트의 속성값은 변경할 수 있다.
const OBJ = { a:1, b:2 }; // 가능 OBJ.a = 3; // 오브젝트 참조값이 변한 것이 아니므로 가능하다. // { a:3, b:2 }가 되었다. // 불가능 OBJ = { a:1, b:2 }; // const이므로 새로운 오브젝트를 담을 순 없다. // Assignment to constant variable

경우2

let a = { a:1 } // let은 가변변수이므로 변경 가능함. const b = a; // a에 담긴 값을 복사해서 담음. 즉 { a:1 } 오브젝트의 ref를 담음. a = { b:2 } // 새로운 오브젝트를 만들어서 ref 값을 a에 담음. // Question : b도 값이 바뀌었을까 ?!
b는 기존의 오브젝트의 ref를 복사해서 받은 것이고
a에는 새로운 오브젝트를 만들어 ref 만 바꾼 것이다.
따라서 b에 담긴 오브젝트는 기존의 오브젝트가 그대로 담겨있다.
 

경우3

경우2와 비슷한 예시로 이번에는 오브젝트가 아닌 값을 넣어 테스트 해보자.
let a = 3 // let은 가변변수이므로 변경 가능함. const b = a; // a의 '값'을 복사해서 담음. a = 5 // a에 새로운 값을 담음 // Question : b도 값이 바뀌었을까 ?!
이번에도 역시 아니다.
값을 복사해서 담는 것이므로 a가 변한다고 해서 b까지 변하진 않는다.