الجديد في إكماسكربت 2021
نستعرض هنا ملخصاً شاملاً للمقترحات الجديدة التي دخلت على توصيف لغة إكماسكربت، الذي يعتبر المعيار القياسي الذي تتوافق معه جافاسكربت، عام 2021. هذه المقالة ستكون جزءاً من مجموعة تغطي مجمل الإضافات والتعديلات الداخلة على جافاسكربت حديثاً.
إضافات ES2021
# String.prototype.replaceAll
تأخذ هذه الدالة بارامترين، وتبحث ضمن السلسلة المحرفية عن كافة الأماكن التي ورد فيها البارامتر الأول وتستبدله بقيمة البارامتر الثاني. البارامتر الأول عبارة عن نمط بحث، قد يكون سلسلة محرفية أو تعبيراً منتظماً RegExp يستخدم للبحث. البارامتر الثاني قد يكون سلسلة نصية أو دالة يتم تنفيذها عند كل حالة مطابقة يعثر عليها.
تعيد دالة replaceAll
ناتج الاستبدال في سلسلة تصية جديدة، أما السلسلة الأصلية فلا تجري عليها أي تغييرات.
إذا كان البارامتر الثاني دالة، فيمكنها استلام 3 بارامترات عند استدعائها عند كل حالة مطابقة: السلسلة النصية التي حققت التطابق، ورقم المحرف الذي وردت عنده هذه السلسلة (index)، والسلسلة المحرفية اﻷصلية كاملة.
const p = 'Almost before we knew it, we had left the ground.';
console.log(p.replaceAll('we', 'they'));
// expected output: "Almost before they knew it, they had left the ground."
// global flag (g) is required when calling replaceAll with regex
// ignore case flag (i) is also used in this example
const regex = /a/ig;
p.replaceAll(regex, (a, b, c) => {console.log(a, b);})
// expected output:
// "A" 0
// "a" 30
# Promise.any
تأخذ هذه الدالة مجموعة كائنات وعود (Pormise
objects) وترجع وعداً جديداً. يتحقق الوعد الجديد عندما يتحقق أول وعد من المجموعة المدخلة ويعيد قيمته نفسها.
إذا لم يتحقق أي وعد من المجموعة، ترجع الدالة وعداً مرفوضاً يعطي خطأ من نوع AggregatorError
. أما في حال ظهور استثناء أثناء تنفيذ الوعود المدخلة، ترجع وعداً مرفوضاً مع إعادة الاستثناء الذي حصل.
const promise1 = Promise.reject(0);
const promise2 = new Promise((resolve) => setTimeout(resolve, 100, 'quick'));
const promise3 = new Promise((resolve) => setTimeout(resolve, 500, 'slow'));
const promises = [promise1, promise2, promise3];
Promise.any(promises).then((value) => console.log(value));
// expected output: "quick"
وبذلك يصبح لدينا أربع دوال تجميع للوعود في إكماسكربت. كما في الجدول التالي:
الدالة | وصف | إصدار |
---|---|---|
Promise.allSettled |
تنتظر انتهاء جميع الوعود بالرفض أو التحقق | ES2020 |
Promise.all |
تنتهي عند رفض أول وعد | ES2015 |
Promise.race |
تنتهي عند تحقق أو رفض أول وعد | ES2015 |
Promise.any |
تنتهي عند تحقق أول وعد | ES2021 |
# WeakRefs
هذا التعديل أضاف كائنين جديدين هما WeakRef
و FinalizationRegistry
. يمكن استخدام هذين الكائنين للتحكم بعملية إدارة الذاكرة والتعامل مع جامع القمامة إلى حد ما. بشكل عام لا ينصح باستخدامهما إلا في حالات خاصة جداً ولا تظهر الحاجة لهما في أكواد التطبيقات.
# Logical Assignment Operators
عوامل الإسناد المنطقية هي مجموعة عوامل تسمح باختصار بعض تعليمات الإسناد إلى شكل أقصر مع تحسين الأداء بشكل طفيف (لكن لا يغرنك الmicro-optimization). في المثال التالي، وضعنا كل تعليمة إسناد جديدة ويليها تعليمتين قديمتين: الأولى مكافئة تماماً، والثانية مكافئة في الناتج ولكنها تسبب عملية إسناد زائدة أحياناً.
a ||= b; // Setter is triggered only when `a` is falsey.
a || (a = b); // Ok
a = a || b; // Ok, but setter is always triggered.
// "And And Equals"
a &&= b;
a && (a = b);
a = a && b;
// "QQ Equals"
a ??= b;
a ?? (a = b);
a = a ?? b;
# Numeric separators
أضيفت إمكانية استخدام الشرطة السفلية ( _
) للفصل بين الخانات عند تعريف الأعداد والثوابت، بهدف تسهيل قرائتها على المبرمج.
let amount = 101_475_938.38; // a hundred million
let x = 0.000_001; // 1 millionth
let y = 1e10_000; // 10^10000
let nibbles = 0b1010_0001_1000_0101; // with Binary numbers
let message = 0xA0_B0_C0; // with Hex values
let budget = 1_000_000_000_000n; // with BigInt number