`Atomics.wait`, `Atomics.notify`, `Atomics.waitAsync`
Atomics.wait
와 Atomics.notify
는 뮤텍스 및 기타 동기화 수단을 구현하는 데 유용한 저수준 동기화 프리미티브입니다. 하지만 Atomics.wait
는 블로킹이기 때문에 메인 스레드에서 호출할 수 없습니다(시도 시 TypeError
가 발생합니다).
Atomics.wait
와 Atomics.notify
는 뮤텍스 및 기타 동기화 수단을 구현하는 데 유용한 저수준 동기화 프리미티브입니다. 하지만 Atomics.wait
는 블로킹이기 때문에 메인 스레드에서 호출할 수 없습니다(시도 시 TypeError
가 발생합니다).
널 병합 제안 (??
)은 기본값을 처리하기 위한 새로운 단축 평가 연산자를 추가합니다.
여러분은 이미 단축 평가 연산자인 &&
와 ||
를 알고 있을 가능성이 높습니다. 이 연산자들은 “true값”과 “false값”을 처리합니다. 예를 들어 lhs && rhs
라는 코드 샘플을 생각해 봅시다. lhs
(좌측 피연산자)가 false값이면, 표현식은 lhs
를 평가합니다. 그렇지 않으면 rhs
(우측 피연산자)를 평가합니다. 반대로 lhs || rhs
라는 코드 샘플의 경우에는, lhs
가 true값이면 표현식은 lhs
를 평가합니다. 그렇지 않으면 rhs
를 평가합니다.
JavaScript에서 긴 속성 접근 체인은 오류를 일으키기 쉽습니다. 이 중 하나라도 null
또는 undefined
(“nullish” 값으로 알려짐)일 수 있기 때문입니다. 각 단계에서 속성 존재 여부를 확인하는 것은 쉽게 깊이 중첩된 if
-문 구조 또는 속성 접근 체인을 복제하는 긴 if
-조건으로 바뀔 수 있습니다:
웹 브라우저에서 사용하기 위한 JavaScript를 작성한 적이 있다면, 전역 this
에 접근하기 위해 window
를 사용한 적이 있을 것입니다. Node.js에서는 global
을 사용했을지도 모릅니다. 두 환경에서 모두 작동해야 하는 코드를 작성한 경우, 사용할 수 있는 것을 감지하여 이를 사용했을 것입니다. 그러나 지원하려는 환경과 사용 사례가 늘어남에 따라 체크해야 할 식별자의 목록이 증가하면서 금방 복잡해집니다:
ES2015에서 Promise가 도입된 이후, 자바스크립트는 정확히 두 가지 Promise 조합자: Promise.all
과 Promise.race
를 지원했습니다.
현재 두 가지 새로운 제안인 Promise.allSettled
와 Promise.any
가 표준화 과정을 진행 중입니다. 이 추가들로 인해 자바스크립트에는 총 네 가지 Promise 조합자가 존재하게 되며, 각각 다른 사용 사례를 가능하게 합니다.
문자열에서 동일한 정규식을 반복 적용하여 모든 매치를 찾는 것은 일반적인 경우입니다. 어느 정도는 String#match
메서드를 사용하여 오늘날에도 가능합니다.
이 예제에서, 우리는 16진수 숫자로만 구성된 모든 단어를 찾고 각 매치를 로그로 출력합니다:
const string = 'Magic hex numbers: DEADBEEF CAFE';
const regex = /\b\p{ASCII_Hex_Digit}+\b/gu;
for (const match of string.match(regex)) {
console.log(match);
}
// 출력:
//
// 'DEADBEEF'
// 'CAFE'
그러나 이것은 매치된 _서브스트링_만 제공합니다. 일반적으로 여러분은 서브스트링뿐만 아니라 각 서브스트링의 인덱스 또는 각 매치 내의 캡처 그룹과 같은 추가 정보를 원합니다.
자체 반복문을 작성하고 매치 객체를 스스로 추적함으로써 이를 달성할 수 있습니다. 그러나 이것은 다소 번거롭고 그렇게 편리하지 않습니다:
const string = 'Magic hex numbers: DEADBEEF CAFE';
const regex = /\b\p{ASCII_Hex_Digit}+\b/gu;
let match;
while (match = regex.exec(string)) {
console.log(match);
}
// 출력:
//
// [ 'DEADBEEF', index: 19, input: 'Magic hex numbers: DEADBEEF CAFE' ]
// [ 'CAFE', index: 28, input: 'Magic hex numbers: DEADBEEF CAFE' ]
새로운 String#matchAll
API를 사용하면 이전보다 더 쉽게 매치 객체를 얻을 수 있습니다. 이제 간단한 for
-of
루프를 작성하여 모든 매치 객체를 가져올 수 있습니다.
const string = 'Magic hex numbers: DEADBEEF CAFE';
const regex = /\b\p{ASCII_Hex_Digit}+\b/gu;
for (const match of string.matchAll(regex)) {
console.log(match);
}
// 출력:
//
// [ 'DEADBEEF', index: 19, input: 'Magic hex numbers: DEADBEEF CAFE' ]
// [ 'CAFE', index: 28, input: 'Magic hex numbers: DEADBEEF CAFE' ]
String#matchAll
은 캡처 그룹이 포함된 정규식에서 특히 유용합니다. 이는 각 개별 매치에 대한 캡처 그룹 포함 정보를 제공합니다.
const string = 'Favorite GitHub repos: tc39/ecma262 v8/v8.dev';
const regex = /\b(?<owner>[a-z0-9]+)\/(?<repo>[a-z0-9\.]+)\b/g;
for (const match of string.matchAll(regex)) {
console.log(`${match[0]} at ${match.index} with '${match.input}'`);
console.log(`→ owner: ${match.groups.owner}`);
console.log(`→ repo: ${match.groups.repo}`);
}
BigInt
는 JavaScript에서 임의 정밀도로 정수를 표현할 수 있는 새로운 숫자형 원시 자료형입니다. BigInt
를 사용하면 Number
의 안전한 정수 범위를 초과하는 큰 정수를 안전하게 저장하고 연산할 수 있습니다. 이 글은 몇 가지 사용 사례를 살펴보고 BigInt
와 Number
를 비교하여 Chrome 67에서 추가된 새로운 기능을 설명합니다.
Dynamic import()
는 정적 import
와 비교하여 새로운 기능을 해제하는 함수 같은 형태의 import
를 도입합니다. 이 기사에서는 두 가지를 비교하고 새로운 내용을 개괄적으로 소개합니다.