ES12 (ECMAScript 2021) چند ویژگی جدید به جاوااسکریپت اضافه کرد که تجربه کدنویسی را بهبود می‌بخشد. در ادامه، ۵ ویژگی متحول‌کننده‌ی این نسخه با مثال توضیح داده شده‌اند:

1. String.prototype.replaceAll

در نسخه‌های قبلی، تابع replace فقط اولین وقوع یک رشته را جایگزین می‌کرد. در ES12، متد replaceAll به شما اجازه می‌دهد همه‌ی موارد مطابقت داده‌شده با یک رشته یا الگو را جایگزین کنید.

const text = "JavaScript is great, and JavaScript is popular!";
const newText = text.replaceAll("JavaScript", "TypeScript");

console.log(newText); // TypeScript is great, and TypeScript is popular!

2. Promise.any

این ویژگی مشابه Promise.race است، اما با این تفاوت که Promise.any زمانی که اولین Promise با موفقیت اجرا شود، نتیجه را برمی‌گرداند. اگر همه‌ی Promise‌ها شکست بخورند، خطا بازگشت داده می‌شود.

const promise1 = Promise.reject('Error 1');
const promise2 = new Promise((resolve) => setTimeout(resolve, 100, 'Result 2'));
const promise3 = new Promise((resolve) => setTimeout(resolve, 200, 'Result 3'));

Promise.any([promise1, promise2, promise3])
  .then(result => console.log(result)) // Result 2
  .catch(error => console.log(error));

3. WeakRefs و FinalizationRegistry

با استفاده از WeakRef، می‌توان ارجاع ضعیفی به یک شیء داشت که باعث می‌شود این شیء برای جمع‌آوری زباله آماده باشد. FinalizationRegistry به شما اجازه می‌دهد زمانی که یک شیء از بین رفت، عملیات خاصی انجام دهید.

let obj = { name: "Object" };
const weakRef = new WeakRef(obj);

// بعد از مدتی، obj ممکن است توسط garbage collector حذف شود.
obj = null; 

const derefObj = weakRef.deref(); 
console.log(derefObj ? derefObj.name : "Object has been garbage collected");

4. Numeric Separators

این ویژگی کد را خواناتر می‌کند و به ما اجازه می‌دهد که از خط تیره برای جدا کردن اعداد بزرگ استفاده کنیم، بدون اینکه روی مقدار واقعی تأثیر بگذارد.

const bigNumber = 1_000_000_000; // معادل 1000000000
console.log(bigNumber); // 1000000000

5. Logical Assignment Operators

عملگرهای تخصیص منطقی (Logical Assignment) ترکیبی از عملگرهای منطقی و تخصیص هستند. این عملگرها شامل &&=, ||=, و ??= می‌شوند.

let x = false;
let y = true;

x ||= y;  // x = x || y
console.log(x); // true

let a = null;
let b = "Default";

a ??= b;  // a = a ?? b
console.log(a); // "Default"

این ویژگی‌ها باعث می‌شوند کدهای جاوااسکریپت کوتاه‌تر، خواناتر و بهینه‌تر شوند.