백틱(``)을 사용하여 문자열을 선언하는 방식. ES6부터 백틱을 사용하여 문자열을 정의할 수 있게 됨
const name = 'Jaehyun';
console.log('My name is' + name + '. nice to meey you'); // My name is Jaehyun. nice to meet you
// 백틱 사용
console.log(`My name is ${name}. nice to meey you`); // My name is Jaehyun. nice to meet you
템플릿 리터럴 앞에 함수 이름을 붙이면 템플릿 리터럴과 템플릿 값의 일부가 전달됨.
// values 길이는 2라고 가정 (템플릿 리터럴 안에 number 타입의 변수(${...})가 2개)
// reduce를 통해 식을 작성하는 것이 보통. (values의 길이를 단정지을 수 없기 때문에) 편의를 위해 아래와 같이 예시를 작성함
const formatNumbers = (strings: TemplateStringsArray, ...values: number[]) : string => {
return strings[0] + values[0].toFixed(2) + values[1].toFixed(2) + strings[1];
}
console.log(formatNumbers`This is value: ${0}, ${4}, it's important.`) // This is value: 0.00, 4.00, it's important.
객체의 고유한 키값
Symbol('foo') === Symbol('foo') // false
Symbol.for('a') === Symbol.for('a') // true
Symbol() 과 Symbol.for()의 차이는?
- Symbol() : 매번 고유한 심볼을 생성. 해당 심볼의 description은 식별에 도움을 주지 않음.
- Symbol.for() : 전역 심볼 레지스트리에 등록된 심볼을 찾거나 생성. 동일한 key가 있으면 동일한 심볼을 재사용
?.
앞의 평가 대상이 undefined나 null이면 평가를 멈추고 undefined를 반환
const user = {
name: null
}
console.log(user.name.first) // 타입 에러
console.log(user.name?.first) // undefined
인덱싱 및 함수에도 사용할 수 있음. (ex. array?.[3], func?.())
||과 함께 조건부 할당에 사용할 수 있는 연산자
|| vs ??
- || : 모든 falsy 값에 적용
- ?? : undefined, null에만 적용
동적 import, 정적 임포트인 import ... from "..."
와 비슷하지만 런타임에 동작하고 Promise를 반환하며 변수를 사용한다는 차이가 있음
루프를 사용하지 않고 캡처 그룹을 포함하여 정규식의 여러 개의 일치 항목을 가져오는 메서드, str.matchAll(regexp)
와 같은 형태로 사용. (regexp는 g 플래그 필수)
const text = "cat, bat, rat";
const regex = /(\w)at/g;
console.log(text.match(regex));
// ["cat", "bat", "rat"]
console.log([...text.matchAll(regex)]);
/*
[
["cat", "c", index: 0, input: "cat, bat, rat", groups: undefined],
["bat", "b", index: 5, input: "cat, bat, rat", groups: undefined],
["rat", "r", index: 10, input: "cat, bat, rat", groups: undefined]
]
*/
const text = "2025-09-15, 2024-12-31";
const regex = /(\d{4})-(\d{2})-(\d{2})/g;
for (const match of text.matchAll(regex)) {
const [full, year, month, day] = match;
console.log({ full, year, month, day });
}
// { full: "2025-09-15", year: "2025", month: "09", day: "15" }
// { full: "2024-12-31", year: "2024", month: "12", day: "31" }
Promise 배열 중 1개라도 실패하면 즉시 reject 처리하는 Promise.all
과 달리 모든 Promise가 끝날 때 까지 기다리며 실패하더라도 결과 배열에 rejected
로 저장함
Promise.all
은 실패한 Promise 1개만은 반환하여 이후 Promise의 성공/실패 유무를 판단하기 까다로움 + 성공한 promise에 접근할 수 없음
const promises = [
Promise.resolve(42),
Promise.reject("에러 발생"),
new Promise((resolve) => setTimeout(() => resolve("done"), 1000))
];
Promise.allSettled(promises).then((result) => {
console.log(result);
})
/*
[
{ status: "fulfilled", value: 42 },
{ status: "rejected", reason: "에러 발생" },
{ status: "fulfilled", value: "done" }
]
*/
매우 큰 정수를 표현하기 위해 도입된 원시 타입, Number.MIN_SAFE_INTEGER ~ Number.MAX_SAFE_INTEGER
범위를 넘어가면 정확도가 낮아질 수 있음
전역 객체를 가리키는 표준화된 식별자, 환경에 따라 동일하게 전역 객체에 접근할 수 있도록 하는 메서드
console.log(globalThis); // 브라우저면 window, Node면 global
ES 모듈 환경에서 모듈 자체에 대한 메타데이터를 담고 있는 객체
ES 모듈에서 다른 모듈을 통째로 재추출 할 때 사용하는 방식
~~.
로 사용할 수 있게끔 묶어서 재추출 할 때 사용