Programming/JavaScript & TypeScript

최신 ECMAScript 요약

Bonita SY 2025. 2. 13. 22:53
728x90

최신 ECMAScript 버전 요약:

  • ECMAScript 2024 (ES2024): 미발표, 현재는 그 기능이 어떻게 될지에 대한 제안들이 논의되고 있는 상태
  • ECMAScript 2023 (ES2023): ECMAScript 2023은 2023년 6월에 발표
  • ECMAScript 2022 (ES2022): 주요 기능으로는 top-level await와 class fields가 포함
  • ECMAScript 2021 (ES2021): 새로운 배열 메서드인 Array.prototype.at(), 논리적 연산자 &&=, ||=, ??= 등을 포함


ECMAScript 2023 (ES2023) 주요 특징

Array.prototype.toSorted(), toSpliced(), toReversed(), with():

  • 배열을 수정하지 않고 새로운 배열을 반환하는 메서드가 추가
  • 이 메서드는 배열을 "정렬", "자르기", "반전", "인덱스 값 교체"하는 기능을 제공
const arr1 = [3, 1, 4, 1, 5, 9];
const sortedArr = arr1.toSorted(); 
console.log(sortedArr); // [1, 1, 3, 4, 5, 9]

const arr2 = [1, 2, 3, 4, 5];
const splicedArr = arr2.toSpliced(1, 2); // index 1부터 2개 삭제
console.log(splicedArr); // [1, 4, 5]

const arr3 = [1, 2, 3];
const reversedArr = arr3.toReversed();
console.log(reversedArr); // [3, 2, 1]

const arr4 = [1, 2, 3];
const newArr = arr4.with(1, 99);
console.log(newArr); // [1, 99, 3]

Hashbang Syntax:

  • 파일의 첫 번째 줄에 #!을 사용할 수 있게 되어 스크립트를 셸 스크립트처럼 실행 가능

WeakRefs improvements:

  • WeakRef 객체의 기능을 개선하여 더 유용하게 사용 가능


ECMAScript 2022 (ES2022) 주요 특징

Top-level await:

  • 이제 최상위 수준에서 await를 사용 가능
  • 모듈에서 직접 await를 사용하여 비동기 작업을 처리 가능
const result = await fetch('https://example.com');


Private methods and fields in classes:

  • 클래스에서 private 메서드와 필드를 사용 가능
  • 이를 통해 클래스 내에서만 접근할 수 있는 필드와 메서드 생성 가능
class MyClass {
  #privateField = 42;
  
  #privateMethod() {
    console.log('Private method');
  }
}

ECMAScript 2021 (ES2021) 주요 특징

String.prototype.replaceAll():

  • 문자열 내에서 모든 일치를 교체할 수 있는 메서드가 추가
const str = 'foo bar foo';
const result = str.replaceAll('foo', 'baz');


Logical Assignment Operators:

  • &&=, ||=, ??= 연산자 추가
  • 이들은 조건에 따라 변수에 값을 할당하는 방식
let x = 5;
x &&= 10;  // x는 5 (Truth 값이므로 변경되지 않음)

let y = 0;
y &&= 10;  // y는 0 (Falsy 값이므로 10으로 변경)

// 기존 방식
if (x) {
  x = 10;
}

// 논리 할당 연산자
x &&= 10;

---

let a = 0;
a ||= 42;  // a는 42 (Falsy 값이므로 변경됨)

let b = "hello";
b ||= "world";  // b는 "hello" (Truth 값이므로 변경되지 않음)

// 기존 방식
if (!a) {
  a = 42;
}

// 논리 할당 연산자
a ||= 42;

---

let c = null;
c ??= "default";  // c는 "default" (null이므로 변경됨)

let d = 0;
d ??= 100;  // d는 0 (Falsy지만 null이 아님, 변경되지 않음)

// 기존 방식
if (c === null || c === undefined) {
  c = "default";
}

// 논리 할당 연산자
c ??= "default";


Promise.any():

  • 주어진 프로미스들 중 가장 먼저 해결된 프로미스를 반환하는 Promise.any()가 추가
const p1 = new Promise((_, reject) => setTimeout(reject, 100, "Error 1"));
const p2 = new Promise((resolve) => setTimeout(resolve, 200, "Success!"));
const p3 = new Promise((_, reject) => setTimeout(reject, 300, "Error 2"));

Promise.any([p1, p2, p3]).then(console.log).catch(console.error);
// 출력: "Success!" (p2가 가장 먼저 성공)
  • 모든 Promise가 실패하면 AggregateError 발생


WeakRefs (Weak References) & FinalizationRegistry

  • WeakRef: 가비지 컬렉션(GC)이 실행될 때 객체가 자동으로 정리되도록 약한 참조를 생성
  • FinalizationRegistry: 객체가 가비지 컬렉션될 때 콜백을 실행
let obj = { data: "important" };
const weakRef = new WeakRef(obj);

console.log(weakRef.deref()); // { data: 'important' }

obj = null; // 이제 obj는 가비지 컬렉션 대상
// weakRef.deref()가 undefined를 반환할 가능성 있음
const registry = new FinalizationRegistry((heldValue) => {
  console.log(`${heldValue} has been garbage collected`);
});

let obj2 = { data: "temp" };
registry.register(obj2, "obj2");

obj2 = null; // 이제 obj2는 가비지 컬렉션 대상
728x90