웹 개발자를 위한 자바스크립트의 모든 것
더북(TheBook)

웹 개발자를 위한 자바스크립트의 모든 것

자바스크립트의 모든 것을
깊이 있게, 알기 쉽게!

웹 전성시대가 되면서 자바스크립트는 변두리 언어에서 핵심 언어로 부상했다. 많은 사람들이 쓰는 언어가 되면서 프런트엔드에서 백엔드까지 영역을 넓혀왔고, 이는 자바스크립트에 다양한 요구를 하는 계기가 되었다. 자바스크립트는 과거보다 현재 더 빠르게 변화하고 성장하는 언어가 되었고, ES2015부터 ES2020까지 매우 빠르게 발전하고 새로운 기능을 추가해왔다. 오랜 자바스크립트 개발자는 기존의 관습이 익숙해서 새로운 기능에 적응하지 못하고, 새로 입성한 자바스크립트 개발자는 구버전과 신버전 사이에서 혼란을 겪는다. 스택 오버플로에서 자바스크립트 분야 상위 열 명 중에 한 명인 크라우더는 십여 년 이상 개발자들의 질문에 답변하면서 이러한 혼란을 잘 이해하고 있으며, 오랜 습관이 무엇인지, 오래된 습관을 새로운 기능으로 바꾸려면 무엇을 해야 하는지 잘 이해하고 있다.

«웹 개발자를 위한 자바스크립트의 모든 것»은 1~3장을 공개합니다.

목차

  • 1장 ES2015부터 ES2020까지 그리고 그 이후의 새로운 장난감
  • 1.1 정의, 이해관계자, 용어
  • 1.1.1 Ecma? ECMAScript? TC39?
  • 1.1.2 ES6? ES7? ES2015? ES2020?
  • 1.1.3 자바스크립트 “엔진”, 브라우저, 그 외
  • 1.2 “새로운 장난감”은 무엇인가?
  • 1.3 새로운 장난감은 어떻게 만들어지는가?
  • 1.3.1 누가 만드는가?
  • 1.3.2 표준이 제정되는 과정
  • 1.3.3 참여하기
  • 1.4 새로운 장난감을 따라가기
  • 1.5 오늘의 장난감을 과거의 환경에서, 내일의 장난감을 오늘의 환경에서 사용하기
  • 1.5.1 바벨로 트랜스파일하는 예
  • 1.6 정리하며
  • 2장 블록 스코프 선언: let과 const
  • 2.1 let과 const 소개
  • 2.2 진짜 블록 스코프
  • 2.3 반복된 선언은 에러다
  • 2.4 호이스팅과 일시적 데드존
  • 2.5 새로운 종류의 전역(global)
  • 2.6 const: 자바스크립트의 상수
  • 2.6.1 const 기초
  • 2.6.2 const가 참조하는 객체는 여전히 변경 가능
  • 2.7 루프의 블록 스코프
  • 2.7. 1 “루프 내 클로저” 문제
  • 2.7.2 바인딩: 변수, 상수, 기타 식별자의 작동 방식
  • 2.7.3 while과 do-while 루프
  • 2.7.4 성능 영향
  • 2.7.5 루프 블록에서 const
  • 2.7.6 for-in 루프에서 const
  • 2.8 과거 습관을 새롭게
  • 2.8.1 var 대신 const 또는 let 사용
  • 2.8.2 변수 범위를 좁게 유지
  • 2.8.3 인라인 익명 함수 대신 블록 스코프 사용
  • 3장 새로운 함수 기능
  • 3.1 화살표 함수와 this, super, 그 외
  • 3.1.1 화살표 함수 문법
  • 3.1.2 화살표 함수와 this
  • 3.1.3 화살표 함수는 생성자가 될 수 없다
  • 3.2 기본값 매개변수
  • 3.2.1 기본값은 표현식이다
  • 3.2.2 기본값은 자체 범위에서 평가된다
  • 3.2.3 기본값은 함수의 인자 수에 포함되지 않는다
  • 3.3 “나머지” 연산자
  • 3.4 매개변수 목록에서 후행 쉼표와 함수 호출
  • 3.5 함수 name 속성
  • 3.6 블록 내 함수 선언
  • 3.6.1 블록 내 함수 선언: 표준 의미론
  • 3.6.2 블록의 함수 선언: 레거시 웹 의미 체계
  • 3.7 과거 습관을 새롭게
  • 3.7.1 다양한 값 대신 화살표 함수 사용 해결 방법
  • 3.7.2 this 또는 인수를 사용하지 않을 때 콜백에 화살표 함수 사용
  • 3.7.3 다른 곳에서도 화살표 함수 고려
  • 3.7.4 호출자가 이 값을 제어해야 할 때 화살표 함수를 사용하지 말라
  • 3.7.5 기본값을 제공하는 코드 대신 기본 매개변수 값 사용
  • 3.7.6 인수 키워드 대신 나머지 매개변수 사용
  • 3.7.7 보증된 경우 후행 쉼표 고려
  • 4장 클래스
  • 4.1 클래스란 무엇인가?
  • 4.2 새로운 클래스 문법 소개
  • 4.2.1 생성자 추가
  • 4.2.2 인스턴스 속성 추가
  • 4.2.3 프로토타입 메서드 추가
  • 4.2.4 정적 메서드 추가
  • 4.2.5 접근자 속성 추가
  • 4.2.6 계산된 메서드 이름
  • 4.3 기존 문법과 비교
  • 4.4 서브클래스 만들기
  • 4.4.1 super 키워드
  • 4.4.2 서브클래스 생성자 작성
  • 4.4.3 슈퍼클래스 프로토타입 속성, 메서드 상속, 접근
  • 4.4.4 정적 메서드 상속
  • 4.4.5 정적 메서드에서 super
  • 4.4.6 새 인스턴스를 반환하는 메서드
  • 4.4.7 내장 객체 상속
  • 4.4.8 super를 이용할 수 있는 곳
  • 4.5 Object.protoype 떠나보내기
  • 4.6 new.target
  • 4.7 클래스 선언 대 클래스 표현식
  • 4.7.1 class 선언
  • 4.7.2 class 표현식
  • 4.8 앞으로 더 배울 것
  • 4.9 과거 습관을 새롭게
  • 4.9.1 생성자 함수를 만들 때 클래스 사용
  • 5장 새로운 객체 기능
  • 5.1 계산된 속성 이름
  • 5.2 단축 속성
  • 5.3 객체의 프로토타입 얻기와 설정하기
  • 5.3.1 Object.setPrototypeOf
  • 5.3.2 브라우저에서 __proto__ 속성
  • 5.3.3 브라우저에서 __proto__ 리터럴 속성 이름
  • 5.4 메서드 문법과 super 외부 클래스
  • 5.5 심볼
  • 5.5.1 왜 심볼인가?
  • 5.5.2 심볼 생성 및 사용
  • 5.5.3 심볼은 정보 은닉을 위한 것이 아니다
  • 5.5.4 전역 심볼
  • 5.5.5 잘 알려진 심볼
  • 5.6 새로운 객체 함수
  • 5.6.1 Object.assign
  • 5.6.2 Object.is
  • 5.6.3 Object.values
  • 5.6.4 Object.entries
  • 5.6.5 Object.fromEntries
  • 5.6.6 Object.getOwnPropertySymbols
  • 5.6.7 Object.getOwnPropertyDescriptors
  • 5.7 Symbol.toPrimitive
  • 5.8 속성 순서
  • 5.9 속성 스프레드 구문
  • 5.10 과거 습관을 새롭게
  • 5.10.1 동적 이름으로 속성을 만들 때 계산된 구문 사용
  • 5.10.2 이름이 같은 변수에서 속성을 초기화 할 때 단축 구문 사용
  • 5.10.3 사용자 지정 “확장”함수 대신 Object.assign을 사용하거나 모든 속성을 명시적으로 복사
  • 5.10.4 기존 객체의 속성을 기반으로 새 객체를 만들 때 스프레드 구문 사용
  • 5.10.5 이름 충돌을 피하기 위해 심볼 사용
  • 5.10.6 __proto__ 대신 Object.getPrototypeOf / setPrototypeOf 사용
  • 5.10.7 메서드에 메서드 구문 사용
  • 6장 이터러블, 이터레이터, for-of, 이터러블 스프레드, 제너레이터
  • 6.1 이터레이터, 이터러블, for-of 루프, 이터러블 스프레드 구문
  • 6.1.1 이터레이터와 이터러블
  • 6.1.2 for-of 루프: 암시적으로 이터레이터 사용하기
  • 6.1.3 이터레이터를 명시적으로 사용하기
  • 6.1.4 반복 중지
  • 6.1.5 이터레이터 프로토타입 객체
  • 6.1.6 무엇이든 반복 가능하게 만들기
  • 6.1.7 반복 가능한 이터레이터
  • 6.1.8 이터러블 스프레드 문법
  • 6.1.9 이터레이터, for-of 그리고 DOM
  • 6.2 제너레이터 함수
  • 6.2.1 값을 생성하는 기본 제너레이터 함수
  • 6.2.2 제너레이터 함수를 사용하여 이터레이터 만들기
  • 6.2.3 메서드로서의 제너레이터 함수
  • 6.2.4 제너레이터 직접 사용
  • 6.2.5 제너레이터로 값 소비하기
  • 6.2.6 제너레이터 함수에서 return 사용
  • 6.2.7 yield 연산자의 우선순위
  • 6.2.8 return과 throw 메서드: 제너레이터 종료
  • 6.2.9 제너레이터와 이터러블를 넘거주는 방법: yield*
  • 6.3 과거 습관을 새롭게
  • 6.3.4 Function.prototype.apply를 사용하는 데 사용했던 대부분의 장소에서 이터러블 스프레드 구문 사용
  • 6.3.5 제너레이터 사용
  • 6.3.1 이터러블을 소비하는 구문의 사용
  • 6.3.2 DOM 컬렉션 반복 기능 사용
  • 6.3.3 이터러블과 이터레이터 인터페이스 사용
  • 7장 디스트럭처링
  • 7.1 개요
  • 7.2 기본 객체 디스트럭처링
  • 7.3 기본 배열(과 이터러블) 디스트럭처링
  • 7.4 기본값
  • 7.5 디스트럭처링 패턴에서 나머지 문법
  • 7.6 다른 이름 사용하기
  • 7.7 계산된 속성 이름
  • 7.8 중첩된 디스트럭처링
  • 7.9 매개변수 디스트럭처링
  • 7.10 반복문에서 디스트럭처링
  • 7.11 과거 습관을 새롭게
  • 7.11.1 객체에서 일부 속성만 가져올 때 디스트럭처링 사용
  • 7.11.2 옵션 객체에 디스트럭처링 사용
  • 8장 프라미스
  • 8.1 왜 프라미스를 사용하는가?
  • 8.2 프라미스 기초
  • 8.2.1 개요
  • 8.2.2 예
  • 8.2.3 프라미스와 “thenable”
  • 8.3 기존 프라미스 사용하기
  • 8.3.1 then 메서드
  • 8.3.2 프라미스를 연결(체이닝)하기
  • 8.3.3 콜백과의 비교
  • 8.3.4 catch 메서드
  • 8.3.5 finally 메서드
  • 8.3.6 then, catch, finally 핸들러에서 throw
  • 8.3.7 두 개의 인수를 갖는 then 메서드
  • 8.4 기존 프라미스에 핸들러 추가하기
  • 8.5 프라미스 만들기
  • 8.5.1 프라미스 생성자
  • 8.5.2 Promise.resolve
  • 8.5.3 Promise.reject
  • 8.6 그 외 프라미스 메서드
  • 8.6.1 Promise.all
  • 8.6.2 Promise.race
  • 8.6.3 Promise.allSettled
  • 8.6.4 Promise.any
  • 8.7 프라미스 패턴
  • 8.7.1 오류 처리 또는 프라미스 반환
  • 8.7.2 연속된 프라미스
  • 8.7.3 병렬 프라미스
  • 8.8 프라미스 안티 패턴
  • 8.8.1 불필요한 new Promise(/* ... */)
  • 8.8.2 오류를 처리하지 않음(또는 적절하게 처리하지 않음)
  • 8.8.3 콜백 API를 변환할 때 오류가 눈에 띄지 않게 하기
  • 8.8.4 거부를 이행으로 암시적으로 변환
  • 8.8.5 연결 외부의 결과 사용 시도
  • 8.8.6 아무것도 하지 않는 핸들러 사용
  • 8.8.7 연결을 잘못 분기
  • 8.9 프라미스 서브클래스
  • 8.10 과거 습관을 새롭게
  • 8.10.1 성공/실패 콜백 대신 프라미스 사용
  • 9장 비동기 함수, 이터레이터, 제너레이터
  • 9.1 async 함수
  • 9.1.1 async 함수는 프라미스를 만든다.
  • 9.1.2 await는 프라미스를 사용한다
  • 9.1.3 await가 사용될 때 표준 로직은 비동기적이다.
  • 9.1.4 예외는 거부이고 거부는 예외다. 반환은 확정이고 완료는 결과다
  • 9.1.5 async 함수의 병렬 작업
  • 9.1.6 await를 반환할 필요가 없다.
  • 9.1.7 함정: 예기치 않은 장소에서 비동기 함수 사용
  • 9.2 비동기 이터레이터, 이터러블, 제너레이터
  • 9.2.1 비동기 이터레이터
  • 9.2.2 비동기 제너레이터
  • 9.2.3 for-await-of
  • 9.3 과거 습관을 새롭게
  • 9.3.1 명시적 프라미스와 then/catch 대신 비동기 함수를 사용
  • 10장 템플릿, 태그 함수, 새로운 문자열 함수
  • 10.1 템플릿 리터럴
  • 10.1.1 기본 기능(태그 없는 템플릿 리터럴)
  • 10.1.2 템플릿 태그 함수(태그가 지정된 템플릿 리터럴)
  • 10.1.3 String.raw
  • 10.1.4 템플릿 리터럴 재사용하기
  • 10.1.5 템플릿 리터럴과 자동 세미콜론 삽입
  • 10.2 향상된 유니코드 지원
  • 10.2.1 유니코드와 자바스크립트 문자열은 무엇일까?
  • 10.2.2 코드 포인트 이스케이프 시퀀스
  • 10.2.3 String.fromCodePoint
  • 10.2.4 String.prototype.codePointAt
  • 10.2.5 String.prototype.normalize
  • 10.3 반복
  • 10.4 새로운 문자열 메서드
  • 10.4.1 String.prototype.repeat
  • 10.4.2 String.prototype.startsWith, endsWith
  • 10.4.3 String.prototype.includes
  • 10.4.4 String.prototype.padStart, padEnd
  • 10.4.5 String.prototype.trimStart, trimEnd
  • 10.5 match, split, search, replace 메서드 업데이트
  • 10.6 과거 습관을 새롭게
  • 10.6.1 문자열 연결 대신 템플릿 리터럴 사용(적절한 경우)
  • 10.6.2 커스텀 플레이스 홀더 메커니즘 대신 DSL을 위해 태그 함수와 템플릿 리터럴 사용
  • 10.6.3 문자열 이터레이터 사용
  • 11장 새로운 배열 함수, 타입이 있는 배열
  • 11.1 새로운 배열 메서드
  • 11.1.1 Array.of
  • 11.1.2 Array.from
  • 11.1.3 Array.prototype.keys
  • 11.1.4 Array.prototype.values
  • 11.1.5 Array.prototype.entries
  • 11.1.6 Array.prototype.copyWithin
  • 11.1.7 Array.prototype.find
  • 11.1.8 Array.prototype.findIndex
  • 11.1.9 Array.prototype.fill
  • 11.1.10 Array.prototype.includes
  • 11.1.11 Array.prototype.flat
  • 11.1.12 Array.prototype.flatMap
  • 11.2 반복, 스프레드, 디스트럭처링
  • 11.3 배열 순서 유지 정렬
  • 11.4 타입이 있는 배열
  • 11.4.1 개요
  • 11.4.2 기본 사용법
  • 11.4.3 ArrayBuffer: 타입이 있는 배열이 사용하는 저장소
  • 11.4.4 엔디언(바이트 순서)
  • 11.4.5 DataView: 버퍼에 대한 미가공 접근
  • 11.4.6 배열 간에 ArrayBuffer 공유
  • 11.4.7 타입이 있는 배열의 서브클래싱
  • 11.4.8 타입이 있는 배열 메서드
  • 11.5 과거 습관을 새롭게
  • 11.5.1 find와 findIndex를 사용하여 루프 대신 배열 검색(적절한 경우)
  • 11.5.2 Array.fill을 사용하여 루프 대신 배열 채우기
  • 11.5.3 readAsBinaryString 대신 readAsArrayBuffer 사용
  • 12장 맵과 세트
  • 12.1 맵
  • 12.1.1 기본 맵 동작
  • 12.1.2 키 동등성
  • 12.1.3 이터러블에서 맵 만들기
  • 12.1.4 맵 내용 반복하기
  • 12.1.5 맵 서브클래싱하기
  • 12.1.6 성능
  • 12.2 세트
  • 12.2.1 기본 세트 동작
  • 12.2.2 이터러블로부터 세트 만들기
  • 12.2.3 세트 내용 반복하기
  • 12.2.4 세트 서브클래싱하기
  • 12.2.5 성능
  • 12.3 위크맵
  • 12.3.1 위크맵은 이터러블이 아니다.
  • 12.3.2 사용 사례와 예
  • 12.3.3 키를 참조하는 값
  • 12.4 위크세트
  • 12.4.1 사용 사례: 추적
  • 12.4.2 사용 사례: 브랜딩
  • 12.5 과거 습관을 새롭게
  • 12.5.1 객체를 범용 맵으로 사용하는 대신 맵 사용
  • 12.5.2 세트를 위한 객체 대신 세트 사용
  • 12.5.3 공개 속성 대신 비공개 정보를 저장하기 위해 위크맵 사용
  • 13장 모듈
  • 13.1 모듈 소개
  • 13.2 모듈 기초
  • 13.2.1 모듈 지정자
  • 13.2.2 명명된 익스포트 기초
  • 13.2.3 기본 익스포트
  • 13.2.4 브라우저에서 모듈 사용하기
  • 13.2.5 노드제이에스에서 모듈 사용하기
  • 13.3 익스포트를 다시 이름 짓기
  • 13.4 다른 모듈의 익스포트를 다시 익스포트하기
  • 13.5 임포트를 다시 이름 짓기
  • 13.6 모듈의 네임스페이스 객체 임포트하기
  • 13.7 다른 모듈의 네임스페이스 객체 익스포트하기
  • 13.8 단지 사이드 이펙트를 위해 모듈 임포트하기
  • 13.9 임포트와 익스포트 엔트리
  • 13.9.1 임포트 엔트리
  • 13.9.2 익스포트 엔트리
  • 13.10 임포트는 살아있고 읽기 전용이다
  • 13.11 모듈 인스턴스는 영역 전용이다
  • 13.12 어떻게 모듈을 읽어 오는가?
  • 13.12.1 임포트와 구문 분석
  • 13.12.2 인스턴스화
  • 13.12.3 평가
  • 13.12.4 임시 데드존(TDZ)를 정리하며
  • 13.12.5 순환 종속성과 TDZ
  • 13.13 임포트/익스포트 문법를 정리하며
  • 13.13.1 다양한 양식의 익스포트
  • 13.13.2 다양한 양식의 임포트
  • 13.14 동적 임포트
  • 13.14.1 동적으로 모듈 임포트
  • 13.14.2 동적 모듈 예
  • 13.14.3 비모듈 스크립트의 동적 임포트
  • 13.15 트리 셰이킹
  • 13.16 번들링
  • 13.17 메타데이터 임포트하기
  • 13.18 워커 모듈
  • 13.18.1 웹 워커를 모듈로 로드하기
  • 13.18.2 노드제이에스 워커를 모듈로 로드하기
  • 13.18.3 워커는 자신의 영역에 있다
  • 13.19 과거 습관을 새롭게
  • 13.19.1 의사 네임스페이스 대신 모듈 사용하기
  • 13.19.2 스코프 지정 함수에서 코드를 래핑하는 대신 모듈 사용하기
  • 13.19.3 모듈을 사용하여 거대한 코드 파일 생성 방지하기
  • 13.19.4 CJS, AMD 및 기타 모듈을 ESM으로 변환하기
  • 13.19.5 자작으로 만드는 것보다 잘 관리된 번들러를 사용하자
  • 14장 리플렉션-리플렉트와 프록시
  • 14.1 리플렉트
  • 14.1.1 Reflect.apply
  • 14.1.2 Reflect.construct
  • 14.1.3 Reflect.ownKeys
  • 14.1.4 Reflect.get, Reflect.set
  • 14.1.5 기타 리플렉트 함수
  • 14.2 프록시
  • 14.2.1 예: 로깅 프록시
  • 14.2.2 프록시 트랩
  • 14.2.3 예: 속성 숨기기
  • 14.2.4 취소 가능한 프록시
  • 14.3 과거 습관을 새롭게
  • 14.3.1 API 객체를 수정하지 않기 위해 컨슈머 코드에 의존하는 대신 프록시 사용
  • 14.3.2 프록시를 사용하여 구현 코드와 계측 코드 분리
  • 15장 정규 표현식 업데이트
  • 15.1 플래그 속성
  • 15.2 새로운 플래그
  • 15.2.1 스티키 플래그(y)
  • 15.2.2 유니코드 플래그(u)
  • 15.2. 3 “만능 점” 플래그(s)
  • 15.3 명명된 캡처 그룹
  • 15.3.1 기본 기능
  • 15.3.2 역참조
  • 15.3.3 대체 토큰
  • 15.4 후방 탐색 지정
  • 15.4.1 긍정 후방 탐색
  • 15.4.2 부정 후방 탐색
  • 15.5 유니코드 기능
  • 15.5.1 코드 포인트 이스케이프
  • 15.5.2 유니코드 속성 이스케이프
  • 15.6 과거 습관을 새롭게
  • 15.6.1 부분 문자열을 생성하고 구문 분석할 때 ^를 사용하는 대신 스티키 플래그(y)를 사용하자
  • 15.6.2 대안을 사용하여 모든 문자(줄 바꿈 포함)를 일치시키는 대신 만능 점 플래그를 사용하자
  • 15.6.3 익명 그룹 대신 명명된 캡처 그룹 사용
  • 15.6.4 다양한 해결 방법 대신 후방 탐색 사용
  • 15.6.5 정규 표현식에서 대리 쌍 대신 코드 포인트 이스케이프 사용
  • 15.6.6 대안 대신 유니코드 패턴 사용
  • 16장 공유 메모리
  • 16.1 소개
  • 16.2 위험! 이곳에는 용이 살고 있다!
  • 16.3 브라우저 지원
  • 16.4 공유 메모리 기초
  • 16.4.1 임계 구역, 잠금, 조건 변수
  • 16.4.2 공유 메모리 생성
  • 16.5 객체가 아니라 메모리가 공유된다
  • 16.6 레이스 컨디션, 비순차 저장, 신선하지 않은 값, 찢어짐 등
  • 16.7 Atomics 객체
  • 16.7.1 저수준 Atomics 객체 기능
  • 16.7.2 Atomics 객체를 사용하여 스레드 일시 중단 및 재개하기
  • 16.8 공유 메모리 예
  • 16.9 이곳에는 용이 살고 있다! (한 번 더)
  • 16.10 과거 습관을 새롭게
  • 16.10.1 대규모 데이터 블록을 반복적으로 교환하는 대신 공유 블록 사용
  • 16.10.2 워커 작업을 분할하는 대신 Atomics.wait 및 Atomics.notify를 사용하여 이벤트 루프 지원(적절한 경우)
  • 17장 그 외
  • 17.1 BigInt
  • 17.1.1 BigInt 생성하기
  • 17.1.2 명시적 또는 암시적 변환
  • 17.1.3 성능
  • 17.1.4 BigInt64Array와 BigUint64Array
  • 17.1.5 유틸리티 함수
  • 17.2 새로운 정수 리터럴
  • 17.2.1 이진 정수 리터럴
  • 17.2.2 8진 정수 리터럴, 2번째 버전
  • 17.3 새로운 수학 메서드
  • 17.3.1 일반 수학 함수
  • 17.3.2 저수준 수학 지원 함수
  • 17.4 지수 연산자(**)
  • 17.5 Date.prototype.toString 변경
  • 17.6 Function.prototype.toString 변경
  • 17.7 숫자 추가
  • 17.7. 1 “안전한” 정수
  • 17.7.2 Number.isInteger
  • 17.7.3 Number.isFinite, Number.isNaN
  • 17.7.4 Number.parseInt, Number.parseFloat
  • 17.7.5 Number.EPSILON
  • 17.8 Symbol.isConcatSpreadable
  • 17.9 다양한 구문 수정
  • 17.9.1 널 병합
  • 17.9.2 옵셔널 체이닝
  • 17.9.3 선택적인 catch 바인딩
  • 17.9.4 JSON에서 유니코드 줄 바꿈
  • 17.9.5 JSON.stringify에서 올바른 양식의 JSON
  • 17.10 다양한 표준 라이브러리 / 전역 추가
  • 17.10.1 Symbol.hasInstance
  • 17.10.2 Symbol.unscopables
  • 17.10.3 globalThis
  • 17.10.4 심볼 설명 속성
  • 17.10.5 String.prototype.matchAll
  • 17.11 부속서 B: 브라우저 전용 기능
  • 17.11.1 HTML스러운 주석
  • 17.11.2 정규 표현식 변경
  • 17.11.3 추가 내장 속성
  • 17.11.4 느슨하거나 모호한 구문의 다양한 비트
  • 17.11.5 document.all이 없을 때와 document.all이 무엇인가?
  • 17.12 꼬리 호출 최적화
  • 17.13 과거 습관을 새롭게
  • 17.13.1 이진 정수 리터럴 사용
  • 17.13.2 다양한 수학적 해결 방법 대신 새로운 수학 함수 사용
  • 17.13.3 기본값을 위해 널 병합 사용
  • 17.13. 4 && 검사 대신 옵셔널 체이닝 사용
  • 17.13.5 오류 바인딩(e)을 사용하지 않을 때는 작성하지 않는다
  • 17.13.6 Math.pow 대신 지수 연산자(**) 사용
  • 18장 예정된 클래스 기능
  • 18.1 퍼블릭과 프라이빗 클래스 필드, 메서드, 접근자
  • 18.1.1 퍼블릭 필드(속성) 정의
  • 18.1.2 프라이빗 필드
  • 18.1.3 프라이빗 인스턴스 메서드와 접근자
  • 18.1.4 퍼블릭 static 필드, 프라이빗 static 필드, 프라이빗 static 메서드
  • 18.2 과거 습관을 새롭게
  • 18.2.1 생성자에서 속성을 만드는 대신 속성 정의 사용(적절한 경우)
  • 18.2.2 접두사 대신 프라이빗 필드 사용(적절한 경우)
  • 18.2.3 비공개 작업을 위해 클래스 외부의 함수 대신 프라이빗 메서드 사용
  • 19장 앞으로 나올 예정인 기능
  • 19.1 최상위 수준 await
  • 19.1.1 개요와 사용 사례
  • 19.1.2 사용 예
  • 19.1.3 에러 핸들리
  • 19.2 위크레프와 클린업 콜백
  • 19.2.1 위크레프
  • 19.2.2 클린업 콜백
  • 19.3 정규 표현식 일치 색인
  • 19.4 String.prototype.replaceAll
  • 19.5 Atomics asyncWait
  • 19.6 다양한 구문 변경
  • 19.6.1 숫자 구분 기호
  • 19.6.2 해시뱅 지원
  • 19.7 사라지게 될 레거시 정규 표현식 기능
  • 19.8 독자에게 감사!
  • 부록 A 신비한 기능 사전(J. K. 롤링에게 사과한다)
  • A.1 기능(알파벳순)
  • A.2 새로운 기본
  • A.3 새로운 구문, 키워드, 연산자, 루프, 그 외
  • A.4 새로운 리터럴 양식
  • A.5 표준 라이브러리 추가와 변경
  • A.6 기타
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.