You Don't Know JS Yet

js 실행 과정

  1. transpile, budling, js엔진에게 전달
  2. js 엔진에서 파싱하여 추상 구문 트리로 바꿈
  3. 추상 구문 트리를 이진 바이트 코드로 바꿈
    a. JIT 가 작동하여 최적화 진행
  4. js 가상 머신이 프로그램 실행

엄격 모드

  • strict mode는 할 수 없는 것에 제약을 두는 모드가 아니라 최적화하고 효율적으로 실행할 수 있게 해주는 모드

  • 원시 타입(primitive type)과 객체 타입(object type)
  • 원시 타입
    • 리터럴(literal)을 사용해 프로그램에 값을 주입함
    • null, undefined의 사용은 자료마다 의견이 다름.
      • 여기서는 비어있는 단일 값 표기시 undefined를 사용하는 것이 안전하다고 함
    • symbol은 사람이 추측할 수 없게 만든 특수한 숨김 값
  • 객체 타입
    • 배열에는 원시 타입, 객체 타입과 상관없이 모든 타입의 값이 들어갈 수 있음

변수

  • var: function scope 접근 범위
  • let: 변수 접근 범위 (block scope)
  • const: let과 유사, 선언되는 순간에 값을 할당, 나중에 다른 값을 재할당할 수 없음
    • 재할당을 못함. 값을 바꿀 수는 있음

함수

  • js에서 함수는 procedure의 의미
  • 함수 선언문(function declarration), 함수 표현식(function esprerssion)
    • 선언문은 코드 실행전까지 식별자와 관계를 맺지 않음
  • 매개변수(parameter)를 통해 입력을 받음
  • return 키워드를 사용하여 함수에거 값을 반환

비교

  • 일치 비교(equality comparison), 동등 비교(equivalence comparison)
  • js에서는 객체끼리 비교할 때 독자성 일치(identity equality)를 비교
    • 다른 언어들은 비교 대상이 객체인 경우에는 값의 본질이나 내용이 아닌 구조적 일치(structural equality)를 비교
    • 참조(독자성)를 대상으로 일치 비교
    • 참조의 독자성 (rreference identity)
  • js에는 객체 구조각 같은지 비교할 방법이 없음. 직접 구현 or 불가능

코드 구조화 패턴

  • 데이터와 행동 관점에서 코드를 구조화하는 패턴은 클래스모듈 두가지
  • 클래스
    • 사용자가 정의한 데이터 타입으로 데이터와 이 데이터를 조작하는 동작이 들어감
    • new 키워드를 사용해 인스턴스를 만들어 구체적인 값으로 사용
    • 상속(inheritance)
    • 다형성(polymorphism): 상속받은 메서드와 새롭게 정의한 메서드의 이름이 동일하고 공존할 수 있음
  • 모듈
    • 클래스와 동일하게 논리적 단위 기준으로 데이터와 행동을 그룹화