게시글

강좌27 - ECMAScript - 6달 전 등록 / 하루 전 수정

ES2020의 변화

2020년, ES2020이 나왔습니다. 이제는 더 이상 ES11같은 숫자와 병용하지 않아도 될 것 같네요. 그냥 ES2020으로 부르겠습니다.

큰 기능보다는 편의기능이 계속 추가되고 있습니다.

matchAll

문자열에서 일치하는 정규표현식을 iterator 형식으로 반환합니다. 또한 캡처링 그룹(소괄호로 감싸진 것)도 결과로 반환합니다. 기존 정규표현식.exec과 비슷합니다.

정규표현식 뒤에 /g를 사용하지 않으면 Uncaught TypeError: String.prototype.matchAll called with a non-global RegExp argument 에러가 발생합니다

const matchAllResult = '11a22b'.matchAll(/(\d)(\D)/g);
matchAllResult.next(); // { value: ['1a', '1', 'a'], done: false }
matchAllResult.next(); // { value: ['2b', '2', 'b'], done: false } 
matchAllResult.next(); // { value: undefined, done: true } 

BigInt

자바스크립트는 큰 숫자를 표현하는 데 문제가 있었습니다. 2^53-1(Number.MAX_SAFE_INTEGER)보다 큰 숫자를 처리할 수가 없었는데요. BigInt 객체가 도입되어서 처리할 수 있게 되었습니다. 숫자 뒤에 n을 붙입니다.

1n + 1n; // 2n
typeof 1n; // bigint

단, BigInt끼리 계산하지 않으면 에러가 발생합니다. 또한 Big"Int"이기 때문에 소수점은 표현하지 못합니다. 그리고 숫자와도 같지 않습니다. 1n !== 1입니다. 단, 1n == 1이니 새로운 타입이 생겼다고 보셔도 되겠습니다. 그런데 또 일반 숫자와 크기 비교는 가능합니다. 정렬도 가능하고요. 0n도 falsy한 값입니다.

Promise.allSettled

기존 Promise.all을 쓸 때 많은 분들이 아쉬워했던 점이 여러 프로미스 중 하나만 실패해도 catch로 이동한다는 점이었습니다.

만약 이미지 업로드 3개를 하는 데 1,3 번째 이미지 업로드는 성공했지만 두 번째만 실패한 경우에도 catch로 이동합니다. 이 때 재시도를 해서 성공한 경우에는 1,3번째 이미지는 두번 올라가게 되는 문제가 발생하는 것이죠. allSettled는 개별적으로 성공 여부를 알려줍니다.

Promise.allSettled([upload(), upload(), upload()]).then((result) => {
  console.log(result[0]); // { status: 'fulfilled', value: 'ok' }
  console.log(result[1]); // { status: 'rejected', reason: 'too big' }  
  console.log(result[2]); // { status: 'fulfilled', value: 'ok' } 
});

성공한 경우 status는 fulfilled로, 반환값은 value로 나오고, 실패한 경우에는 status는 rejected, 반환값은 reason으로 나옵니다. 따라서 실패한 Promise만 추려서 재요청할 수 있습니다. all을 쓸 이유가 현저하게 줄어들 것 같네요.

globalThis

예전에는 브라우저의 전역객체는 window였고 Node.js의 전역객체는 global이었습니다. 둘이 달라서 분기처리를 해줘야 했던 경우가 많았는데 이제는 globalThis라는 것으로 통일되었습니다. 물론 기존 window나 global도 존재합니다.

브라우저에서는

globalThis === window // true;

노드에서는

globalThis === global; // true

로 동작합니다.

optional chaining

자바스크립트에서 가장 많이 보는 에러가 cannot read property X of undefined 또는 cannot read property Y of undefined입니다. 이를 방지하기 위해서

if (a) {
  if (a.b) {
    console.log(a.b.c);
  }
}

또는

console.log(a && a.b && a.b.c);

같은 보호를 해주었어야 했죠.

이제 옵셔널 체이닝 기능이 생겨서

console.log(a?.b?.c);

할 수 있습니다. 문법적으로 간단해졌다고 보시면 됩니다. a나 b가 존재하지 않는다면 전체 값이 undefined가 됩니다.

다만 메서드나 함수 사용 시 주의할 점은 ?. 자체가 연산자이므로 다음과 같이 해야 합니다.

const a = {
  b() {
    return 'zerocho';
  }
};
console.log(a.b?.());

a.b?()가 아니라 a.b?.()임을 기억하세요.

nullish coalescing

널 병합 기능으로 optional chaining처럼 편의성을 위해 추가된 기능입니다.

기존에는 삼항연산자나 기본값연산자(||) 보호연산자(&&)에서 조건문 부분에 null이나 undefined외에도 0, '', NaN, false 등은 거짓으로 처리되었습니다. 이제 널 병합 연산자(??)를 사용하면 null과 undefined인 경우에만 거짓으로 처리됩니다.

'' || 'zerocho'; // 'zerocho';
'' ?? 'zerocho'; // ''
null || 'zerocho'; // 'zerocho'
null ?? 'zerocho'; // 'zerocho' 
false ?? 'zerocho'; // false

null과 undefined를 다른 falsy한 값에서 발라내기 귀찮으셨던 분들께는 희소식이 될 것 같네요.

정식 스펙이 되지 못한 것들은 stage-3~0 시리즈로 정리해보겠습니다.

조회수:
0
목록
투표로 게시글에 관해 피드백을 해주시면 게시글 수정 시 반영됩니다. 오류가 있다면 어떤 부분에 오류가 있는지도 알려주세요! 잘못된 정보가 퍼져나가지 않도록 도와주세요.
Copyright 2016- . 무단 전재 및 재배포 금지. 출처 표기 시 인용 가능.

댓글

1개의 댓글이 있습니다.
5달 전
좋은글 잘보고 갑니다.
우에서 설명한것이 ES2020 에서 변경된사항의 전부 입니까?
5달 전
네 거의 전부입니다.