자바스크립트 - 데이터 타입 & 변수와 호이스팅

HELLO WORLD🙌·2020년 7월 25일
0

TIL

목록 보기
14/23

데이터타입

종류

기본형 (원시형, primitive type)

  • number
  • string
  • boolean
  • null : 이 값이 없다! 라고 고의적으로 선언한 값
  • undefined : 아직 값이 설정되지 않아서 없는 값
  • symbol (ES6 추가)

참조형 (reference type)

  • 객체 (object)
    • 배열 (Array)
    • 함수 (Function)
    • 날짜 (Date)
    • 정규표현식 (RegExp)
    • Map, WeakMap (ES6 추가)
    • Set, WeakSet (ES6 추가)

무엇이 다른가?

  • 할당이나 연산시, 기본형은 값이 담긴 주솟값을 바로 복제하는 반면,
    참조형은 값이 담긴 주솟값들로 이루어진 묶음을 가르키는 주솟값을 복제한다.
  • 기본형은 불변값이고 참조형은 가변값이다.

변수와 호이스팅

  • 변수는 변수는 3단계에 걸쳐 생성된다.

    • 선언 단계
      변수를 실행 컨텍스트의 변수 객체(Variable Object)에 등록한다. 이 변수 객체는 스코프가 참조하는 대상이 된다.

    • 초기화 단계
      변수 객체(Variable Object)에 등록된 변수를 위한 공간을 메모리에 확보한다. 이 단계에서 변수는 undefined로 초기화된다.

    • 할당 단계
      undefined로 초기화된 변수에 실제 값을 할당한다.

      그리고 식별자인 변수명을 사용해 변수에 저장된 값을 참조한다.

      데이터는 메모리에 저장되어 있다. 메모리에 저장된 데이터를 참조하려면 데이터가 저장된 메모리 상의 주소(address)를 알아야 한다. 식별자는 데이터가 저장된 메모리 상의 주소를 기억한다. 따라서 식별자를 통해 메모리에 저장된 값을 참조할 수 있다.

let, const, var의 차이

  • var는 function 단위의 scope을 가진다.
  • let, const
    • block 단위의 scope을 가진다.
    • 재선언 불가능하다.
    • hoisting 되긴하지만 변수가 실제 있는 위치에 도달할 때까지 액세스할 수 없다.
  • let과 const의 차이는 변수의 immutable여부이다.
    let은 변수에 재할당이 가능하지만, const는 변수 재선언, 재할당 모두 불가능하다.

호이스팅

  • var 키워드로 선언된 변수는 선언 단계와 초기화 단계가 한번에 이루어진다.
    즉, 스코프에 변수를 등록(선언 단계)하고 메모리에 변수를 위한 공간을 확보한 후, undefined로 초기화(초기화 단계)한다.
    따라서 변수 선언문 이전에 변수에 접근하여도 스코프에 변수가 존재하기 때문에 에러가 발생하지 않는다. 다만 undefined를 반환한다. 이후 변수 할당문에 도달하면 비로소 값이 할당된다.
    이러한 현상을 변수 호이스팅(Variable Hoisting)이라 한다.

  • let 키워드로 선언된 변수는 선언 단계와 초기화 단계가 분리되어 진행된다.
    즉, 스코프에 변수를 등록(선언단계)하지만 초기화 단계는 변수 선언문에 도달했을 때 이루어진다. 초기화 이전에 변수에 접근하려고 하면 참조 에러(ReferenceError)가 발생한다. 이는 변수가 아직 초기화되지 않았기 때문이다. 다시 말하면 변수를 위한 메모리 공간이 아직 확보되지 않았기 때문이다.
    따라서 스코프의 시작 지점부터 초기화 시작 지점까지는 변수를 참조할 수 없다. 스코프의 시작 지점부터 초기화 시작 지점까지의 구간을 일시적 사각지대(Temporal Dead Zone; TDZ)라고 부른다.

0개의 댓글