ES2016 ~ ES2023 최신 문법
Post

ES2016 ~ ES2023 최신 문법

ES6(ES2015)큰 변화 이후에도 업데이트가 꾸준히 되고 있는데, ES2016부터 ES2023의 업데이트된 내용들을 정리해보려한다.

ES2016

Array.prototype.includes()

1
    arr.includes(valueToFind[,fromIndex])

includes() 메서드를 사용하여 배열에 특정 원소가 포함되어 있는지 확인할 수 있다. valueToFind자리에 찾은 원소값을 입력하면된다. 포함되어 있으면 true, 그렇지않으면 false를 반환한다.
includes()는 문자나 문자열을 비교할때 대소문자를 구분한다.

또한 두번째 값으로 fromIndex자리에 인덱스를 넣으면 검색을 시작할 위치를 지정할 수 있다. 0이 기본값이며 음수도 전달가능하다.
fromIndex값이 배열의 길이보다 같거나 크면 false를 반환하고 배열은 검색되지 않는다.
음수값이 들어갈경우, 계산된 인덱스가 -1*array.length보다 작거나 같으면 전체 배열이 검색된다.

지수연산자 **

ES2016 이전에는 제곱계산을 하기 위해 Math.pow()함수를 사용했어야 하지만, 지금은 지수연산자(**)를 사용하여 간단하게 제곱값을 계산할 수 있다.

1
2
3
    Math.pow(2,2); //4

    2**2; //4

ES2017

async & await

async와 await을 사용하여 promise를 좀 더 편리하게 사용할 수 있다.

async는 function앞에 위치하여야 한다.
function 앞에 async를 붙이면 해당 함수는 항상 프로미스를 반환하고, 프로미스가 아닌것은 프로미스로 감싸 반환한다.

await은 async 함수 안에서만 동작하는데 await코드를 만나면 프로미스가 처리될 때까지 기다리게된다.

1
2
3
4
5
6
7
8
9
10
11
12
   async function f() {

    let promise = new Promise((resolve, reject) => {
        setTimeout(() => resolve("완료!"), 1000)
    });

    let result = await promise; // 프라미스가 이행될 때까지 기다렸다가 promise가 처리되면 실행됨

   alert(result); // "완료!"
   }

   f();

await은 프로미스가 처리될 때까지 함수 실행을 기다리게 만든다. 프로미스가 처리되면 그 결과와 함께 실행된다.
프로미스가 처리되길 기다리는 동안 엔진이 다른 스크립트를 실행하거나 이벤트 처리등의 일처리를 할 수 있기 때문에 CPU리소스가 절약된다.

async,await

문자열 패딩

문자열의 시작과 끝부분에 원하는 길이만큼 다른 문자열을 채울 수 있게 되었다.
String.prototype.padStart()와 String.prototype.padEnd()를 사용하면된다.

1
2
3
4
    "hi".padStart(2); // "  hi"
    "hi".padEnd(3); // "hi   "

    "hi".padEnd(10,"~"); //hi~~~~~~~

Trailing Commas

Trailing comma는 final comma라고도 불리며 새로운 엘리먼트나 매개변수, 속성을 코드에 추가할 때 유용하다.

새로운 속성을 추가할 때, 마지막 줄에 trailing comma가 있다면 그 줄은 수정하지 않아도 다음줄에 이어서 작성할 수 있다.

이로인해 버전관리 이력이 간단해지고 코드 편집이 더 편해진다.

원래 배열와 객체 리터럴에 허용이 됐지만, ES2017부터 함수의 매개변수에도 허용되기 시작하였다.

1
2
3
4
5
    function func(a, ){

    };

    (a, )=>{};

mdn-trailing commas

ES2018

Object rest & spread

ES6에서 배열의 rest와 spread 사용이 가능해졌고, ES2018에서는 객체에서도 사용이 가능해졌다.

rest와 spread를 활용하여 더 쉽게 얕은 복사를 할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
    const obj={
        n1:1,
        n2:2,
        n3:3,
        n4:4,
        n5:5
    };

    const {n1,n2, ...n} = obj;

    console.log(n);//{"n3":3, "n4":4, "n5":5 }

Async iteration

제너레이터 함수와 for of 문에서 async를 사용할 수 있게 되었다. async 이터레이터와 제너레이터

for …of문은 반복가능한 객체(array, map, set, string)에 대해 반복하고 각 개별 속성값에 대해 실행되는 구문이 있는 사용자정의 반복 루프를 생성한다.

1
2
3
4
5
6
7
8
9
    const arr=['a','b','c'];

    for(const element of arr){
        console.log(element);
    }

    //"a"
    //"b"
    //"c"

정규식 새기능

  • s 플래그
  • 명명된 캡쳐 그룹
  • 룩비하인드 어서션
  • 유니코드 속성 이스케이프

정규식 부분은 추후에 공부하면서 총정리 글을 작성하고, 링크를 걸 예정이다.

ES2019

String.prototype.trimStart() & trimEnd()

trimStart()는 문자열 시작 부분의 공백을 제거하고, trimEnd()는 문자열의 끝부분 공백을 제거한다.

원래 있던 trim()을 더 섬세하게 사용할 수 있게 되었다.

Function.prototype.toString()

Function.prototype.toString()메서드는 함수의 소스코드를 나타내는 문자열을 반환한다.

ES2016까지는 소스 코드의 주석과 공백문자를 제거했었지만, ES2019부터는 문자열에 주석과 공백도 포함된다.

1
2
3
4
5
    function age(n){
        return n+"살 입니다"; //나이 출력
    }

    console.log(n.toString()); //'function age(n){return n+"살 입니다"; //나이 출력 }'

ES2020

BigInt

정수의 최대값은 2^53-1이었는데 이보다 더 큰 정수를 표현하기 위해 BigInt를 사용할 수 있다.

BigInt는 정수 리터럴의 뒤에 n을 붙이거나 함수 BigInt()를 호출해 생성할 수 있다.

1
2
3
4
5
6
7
8
9
10
    const theBiggestInt = 9007199254740991n;

    const alsoHuge = BigInt(9007199254740991);
    // ↪ 9007199254740991n

    const hugeHex = BigInt("0x1fffffffffffff");
    // ↪ 9007199254740991n

    const hugeBin = BigInt("0b11111111111111111111111111111111111111111111111111111");
    // ↪ 9007199254740991n

BigInt는 Number와 달리 Math객체의 메서드와 함께 사용할 수 없고, 연산에서 Number와 혼합해 사용할 수 없다.

Dynamic import

ES2020부터 필요할 때 동적으로 모듈을 가져올 수 있다.

1
2
3
    if(a){
        const mod = await import('./js/module.js');
    }

Optional Chaining(?.)

옵셔널 체이닝 연산자(?.)는 참조값이 null또는 undefined일 경우 에러대신 undefined를 리턴한다.

따라서 참조가 누락될 가능성이 있을 경우 옵셔널 체이닝 연산자를 사용하면 더 짧고 간단한 표현식으로 사용할 수 있다.

1
2
3
4
    obj?.prop
    obj?.[expr]
    arr?.[index]
    func?.(args)

Optional chaining

null 병합 연산자 (??)

널 병합 연산자(??)는 왼쪽 피연산자가 null이나 undefined일 경우 오른쪽 피연산자를 반환하고, 그렇지 않으면 왼쪽 피연산자를 반환하는 논리 연산자이다.

1
2
3
    const foo = null ?? 'default string';
    console.log(foo);
    // expected output: "default string" 
비슷한 이 논리 연산자를 사용하면 boolean으로 강제 변환될 수 있으므로 예기치 않는 결과를 초래할 수 있다.

globalThis

ES2020부터 globalThis를 사용하여 전역 객체를 참조할 수 있게 되었다.

ES2021

논리 할당 연산자

논리 연산자와 할당 표현식을 결합할 수 있게 되었다.

1
2
3
4
5
6
7
8
9
10
    //원래 작성 방식
    a = a || b;
    a = a && b;
    a = a ?? b;

    //논리 할당 연산자
    a ||= b;
    a &&= b;
    a ??= b;

숫자 구분 기호

큰 자릿수를 구분할 때 언더바(_)를 사용해 큰숫자를 구분하기 쉽게 표시할 수 있다.

1
2
    const n = 100_000_000;
    console.log(x);// 100000000;

ES2022

클래스 속성

속성을 constructor안에 쓰지 않아도 되며, 클래스 내부에서만 쓸 수 있는 private 속성이 추가되었다. 앞에 #만 붙이면된다.

static 속성은 앞에 static을 붙이면 되고, 앞에 #을 붙여 private로 만들 수 있다.

computed속성도 새로 생겼다. computed 속성은 []안에 식을 적어주면 된다.

at 메서드

at()메서드는 정수값을 받아 배열에서 해당값에 해당하는 인덱스의 요소를 반환한다.
양수와 음수를 모두 지정할 수 있고, 음수값의 경우 배열의 뒤에서부터 인덱스를 센다.

이제는 배열의 마지막 요소를 가져오고 싶을 때 array[array.length-1] 대신에 간단히 array.at(-1)을 사용할 수 있다.

hasOwn

object에는 hasOwn 메서드가 추가되었다. 객체에 속성이 포함되어 있는지 체크하며 반환값은 boolean값이다.

1
2
    Object.hasOwn({a:1},'x'); //false
    Object.hasOwn({a:1},'a'); //true

Error cause속성

에러 객체에 구체적인 원인을 작성할 수 있는 cause 속성이 추가되었다.

1
2
    const a = new Error('error',{cause:'오타'});
    a.cause; //오타

ES2023

findLast, findLastIndex

find 메서드는 배열에서 조건을 만족하는 첫번째 요소를 찾는 메서드이다.

그런 find 메서드에 기능들이 확장되었다.

findLast는 배열에서 조건을 만족하는 마지막 요소를 찾고, findLastIndelx는 요소가 아닌 인덱스를 찾게된다.

참고