js의 변수는 원시/객체로 나뉜다.
원시
- Booelan
true/false가 존재.- Null
null- undefined
값을 할당받지 않은 변수.- Number
64비트의 이진 형식. -(2^53-1) ~ 2^53 의 값을 지닌다.
Nan, +Infinity, -Infinity 의 값또한 가질 수 있다.- BigInt
임의 정밀도로 정수를 나타낼수 있는 원시값.- String
16비트의 부호 없는 정수값으로 이루이전 집합.- Symbol
고유하고 변경 불가능한 값. 'ATOM'
객체
var
var value = 'banana'
console.log(value) // banana
var value = 'apple'
console.log(value) // apple
let
let value = 'banana'
console.log(value) // banana
let value = 'apple'
console.log(value)
//Uncaught SyntaxError: Identifier 'name' has already been declared
let
은 위와같이 여러번 선언이 불가능하다 (const또한 그렇다)
let
let value = 'banana'
console.log(value) // banana
value = 'apple'
console.log(value) // apple
const
const value = 'banana'
console.log(value) // banana
value = 'apple'
//Error: Uncaught ReferenceError: bar is not defined
둘의 차이는 immutable
라는 속성으로, const는 재할당이 불가능하다.
js는 var
, let
, const
, function
, function*
, class
를 모두 호이스팅 하여, 스코프의 선두에서 동작하도록 한다.
하지만 let
은 이러한 특성과 달리 호이스팅 되지 않은것 처럼 동작한다.
console.log(foo); // undefined
var foo;
console.log(bar); // Error: Uncaught ReferenceError: bar is not defined
let bar;
why?
변수는 선언
>초기화
>할당
의 단계를 통해 생성된다.
var은 이때 선언
과 초기화
가 한꺼번에 이루어진다.
console.log(foo); // undefined
var foo;
console.log(foo); // undefined
foo = 1; // 할당문에서 할당 단계가 실행된다.
console.log(foo); // 1
하지만 let은 선언
, 초기화
단계가 분리되어 이루어진다.
console.log(foo); // ReferenceError: foo is not defined
let foo; // 변수 선언문에서 초기화 단계가 실행된다.
console.log(foo); // undefined
foo = 1; // 할당문에서 할당 단계가 실행된다.
console.log(foo); // 1
출처