You Don't Know JS Yet
js 실행 과정
- transpile, budling, js엔진에게 전달
- js 엔진에서 파싱하여 추상 구문 트리로 바꿈
- 추상 구문 트리를 이진 바이트 코드로 바꿈
a. JIT 가 작동하여 최적화 진행
- 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): 상속받은 메서드와 새롭게 정의한 메서드의 이름이 동일하고 공존할 수 있음
- 모듈
- 클래스와 동일하게 논리적 단위 기준으로 데이터와 행동을 그룹화