-
ES2020 7가지 새로운 팁Javascript 2020. 6. 29. 01:32
급진적으로 계속해서 쏟아져 나오고 있는 ES 버전들을 모두 리뷰 하기에는 많은 시간이 소모됩니다.
ES6(ES2015)를 시작으로 7, 8 계속 이어져오다가 정식 명칭을 아예 ES2020으로 연도를 붙이는 것으로 변경이 된 것 같습니다.
아시다시피 2015 년 ES6 이후로 Ecma International의 TC39에서 매년 ECMAScript의 새로운 버전을 출시합니다.
ECMAScript 2020은 ECMAScript 언어 사양의 11 번째 버전입니다.
이 새로운 반복에는 고유 한 새로운 기능이 포함되어 있습니다.
1. ‘globalThis’
- JavaScript 언어는 현재 매우 인기가 있으며 웹 브라우저에서 물론 다양한 환경에서 사용할 수 있지만 JavaScript는 서버 측, 스마트폰, 로봇 등에서 실행될 수도 있습니다. 특히 node에서도 사용하죠.
- 각 환경에는 전역 객체에 액세스하기위한 고유한 객체 모델 및 구문이 제공됩니다.
- 따라서 여러 환경에서 작동하는 JavaScript 코드를 작성하기가 어려울 수 있습니다.
- 웹 브라우저에서는 windows, node 환경에서는 global에 전역 객체가 담깁니다.
// browser environment console.log(window); // node.js environment console.log(global); // Service worker environment console.log(self); // ...
지금부터는 globalThis를 사용하세요.
2. ‘Promise.allSettled()’
- Promise.allSettled()는 모든 promise가 이행되거나 rejecte된 상태를 속성을 통해 각 promise의 결과를 설명하는 객체와 함께 resolve되는 promise를 반환합니다. 이를 통해 이행결과를 쉽게 필터링 할 수 있습니다.
const p1 = new Promise((res) => res("🍕")); const p2 = new Promise((res, rej) => rej("🍍")); const p3 = new Promise((res) => res("🍺")); Promise.allSettled([p1, p2, p3]).then(data => console.log(data)); // [ // { status: "fulfilled", value: "🍕" }, // { status: "rejected", value: "🍍" }, // { status: "fulfilled", value: "🍺" }, // ]
3. Nullish Coalescing 연산자 (??)
- null 값을 처리하는 방식으로 두 값 사이 ||로 표시되는 or 연산자와 다릅니다.
- 두 연산자를 비교하여 실제로 살펴 보도록하겠습니다.
- 기존에는 null이나 undefined외에도 0, '', NaN, false 등은 거짓으로 처리되었습니다.
- 이제 널 병합 연산자(??)를 사용하면 null과 undefined인 경우에만 거짓으로 처리됩니다.
const test = { null: null, number: 0, string: '', boolean: false }; const undefinedValue = test.dog || "Cat"; // "Cat" const undefinedValue = test.dog ?? "Cat"; // "Cat" const nullValue = test.null || "Default"; // "Default" const nullValue2 = test.null ?? "Default"; // "Default" const numberValue = test.number || 1; // 1 const numberValue2 = test.number ?? 1; // 0 const stringValue = test.string || "Hello"; // "Hello" const stringValue2 = test.string ?? "Hello"; // "" const booleanValue = test.boolean || true; // true const booleanValue2 = test.boolean ?? true; // false
4. 선택 체인 연산자 (?.)
- 지금까지는 객체 내부에 깊게 중첩 된 속성 값을 찾거나 객체 또는 null / undefined를 반환하는 API를 사용하는 경우 중간 값을 확인하기 위해이 방법으로 진행해야하는 경우가 종종 있습니다.
// 중간 노드가 있는지 체크 const deeplyNestedValue = obj && obj.prop1 && obj.prop1.prop2; // 돔에 노드가 있는지 체크 const fooInputEl = document.querySelector('input[name=foo]'); const fooValue = fooInputEl && fooInputEl.value;
- 선택 체인 연산자를 사용하면 이러한 여러 사례를 보다 편리하게 처리 할 수 있습니다.
- 위의 예제를 다시 작성하면 다음과 같은 결과가 나타납니다.
// 중간 노드가 있는지 체크 const deeplyNestedValue = obj?.prop1?.prop2; // 돔에 노드가 있는지 체크 const fooValue = document.querySelector('input[name=foo]')?.value;
- 저는 아폴로를 하다가 한번 접했던 것 같습니다.
- 다음과 같은 상황에서도 사용 가능합니다.
// 오직 a가 null이나 undefined가 아닐 경우에만 x를 증가시킵니다. a?.[++x] // 함수나 메서드 콜에서도 사용 func?.(...args)
5. BigInt
- JavaScript로 숫자를 나타내는 number가 이미 있습니다.
- 문제는 가장 큰 숫자는 2⁵³입니다.
- 그보다 더 이상 신뢰할 수 없습니다.
const x = Number.MAX_SAFE_INTEGER; // 9007199254740991 const y = x + 1; // 9007199254740992 • equal to 2^53 const z = x + 2; // 9007199254740992 • well, it's broken
- 다음과 같이 n만 붙여서 해결할 수 있습니다.
const aBigInteger = 9007199254740993n; const evenBigger = BigInt(9007199254740994); // 9007199254740994n const fromString = BigInt("9007199254740995"); // 9007199254740995n // 넘버로 변환할 순 없습니다. Number(900719925474099267n); // 900719925474099300 ..... -ㅁ-
6. Dynamic import
- import도 잘 못쓰는데 너무 성급한거 아닌가 싶을 수도 있습니다만..
// 함수로써 사용하면 import는 프로미스를 리턴합니다. // 콜백에도 사용할 수 있고.. import('/module.js') .then((module) => { // 이 모듈로 뭔가 해야할 때.. 사용 }); // async / await로써도 사용할 수 있습니다. async function () { let module = await import('/modules.js'); }
7. String.protype.matchAll
- matchAll() 메서드는 정규식 (RegExp)에 대해 문자열과 일치하는 모든 결과의 반복자를 반환하고 다음과 같이 작동합니다.
const regexp = RegExp('[a-z]*ball','g'); const str = 'basketball handball pingpong football'; const matches = str.matchAll(regexp); // 이것은 반복 연산자 이기 때문에 결과 값을 반복할 수 있습니다. let match = matches.next(); while (!match.done) { console.log(match.value); match = matches.next(); } // ["basketball", index: 0, input: "basketb...", groups: undefined] // ["handball", index: 11, input: "basketb...", groups: undefined] // ["football", index: 29, input: "basketb...", groups: undefined] // 모든 결과값을 배열에 한번에 담을 수도 있습니다. let results = [...str.matchAll(regexp)];
결론
이 모든 것들을 사용할 때는 바벨이 필요하겠죠??
@babel/plugin-proposal-nullish-coalescing-operator @babel/plugin-proposal-private-methods @babel/plugin-proposal-optional-chaining @babel/plugin-syntax-bigint @babel/plugin-syntax-dynamic-import
위 바벨과 함께 사용해야 프로젝트에서 사용할 수 있을 것입니다.
출처 : https://medium.com/better-programming/8-new-features-shipping-with-es2020-7a2721f710fb
'Javascript' 카테고리의 다른 글
[JS] Snowpack3 - ESM의 시대가 곧 도래합니다. (0) 2021.01.23 [JS] 자바스크립트 프레임워크 내부 파헤치기 4가지 (0) 2021.01.03 [javscript] 12가지 Array 팁 (0) 2020.06.28 Constructor vs Literal (0) 2020.06.22 JavaScript 기술을 향상시키는 12 가지 개념 (0) 2020.06.21