تعديلات إكماسكربت 2016 ومابعد
ملخص التغييرات المضافة على توصيف إكماسكربت، وهو المعيار القياسي الذي تتوافق معه لغة جافاسكربت، منذ عام 2016 وحتى عام 2025.
تُنشَر هذه التعديلات على مستودع مقترحات إكماسكربت على جت هب. هناك أيضاً جدول توافقية يبين مدى توافر هذه الميزات على المتصفحات والمنصات المختلفة.
إضافات ES2025
Promise.try
Sync Iterator helpers
JSON Modules
Import Attributes
RegExp Modifiers
New Set methods
Duplicate named capture groups
إضافات ES2024
https://github.com/tc39/proposal-arraybuffer-transfer
https://github.com/tc39/proposal-promise-with-resolvers
https://github.com/tc39/proposal-array-grouping
https://github.com/tc39/proposal-resizablearraybuffer
https://github.com/tc39/proposal-regexp-v-flag
https://github.com/tc39/proposal-atomics-wait-async
https://github.com/tc39/proposal-is-usv-string
إضافات ES2023
https://github.com/tc39/proposal-change-array-by-copy https://github.com/tc39/proposal-symbols-as-weakmap-keys https://github.com/tc39/proposal-hashbang https://github.com/tc39/proposal-array-find-from-last
إضافات ES2022
https://github.com/tc39/proposal-error-cause https://github.com/tc39/proposal-class-static-block https://github.com/tc39/proposal-accessible-object-hasownproperty
.at()
Ergonomic brand checks for Private Fields
Top-level await
RegExp Match Indices
Class Fields (Private instance methods and accessors, Class Public Instance Fields & Private Instance Fields, Static class fields and private static methods)
إضافات ES2021
String.prototype.replaceAll
تأخذ هذه الدالة بارامترين، وتبحث ضمن السلسلة المحرفية عن كافة الأماكن التي ورد فيها البارامتر الأول وتستبدله بقيمة البارامتر الثاني. البارامتر الأول عبارة عن نمط بحث، قد يكون سلسلة محرفية أو تعبيراً منتظماً RegExp يستخدم للبحث. البارامتر الثاني قد يكون سلسلة نصية أو دالة يتم تنفيذها عند كل حالة مطابقة يعثر عليها.
تعيد دالة replaceAll
ناتج الاستبدال في سلسلة تصية جديدة، أما السلسلة الأصلية فلا تجري عليها أي تغييرات.
إذا كان البارامتر الثاني دالة، فيمكنها استلام 3 بارامترات عند استدعائها عند كل حالة مطابقة: السلسلة النصية التي حققت التطابق، ورقم المحرف الذي وردت عنده هذه السلسلة (index)، والسلسلة المحرفية اﻷصلية كاملة.
Promise.any
تأخذ هذه الدالة مجموعة كائنات وعود (Pormise
objects) وترجع وعداً جديداً. يتحقق الوعد الجديد عندما يتحقق أول وعد من المجموعة المدخلة ويعيد قيمته نفسها.
إذا لم يتحقق أي وعد من المجموعة، ترجع الدالة وعداً مرفوضاً يعطي خطأ من نوع AggregatorError
. أما في حال ظهور استثناء أثناء تنفيذ الوعود المدخلة، ترجع وعداً مرفوضاً مع إعادة الاستثناء الذي حصل.
وبذلك يصبح لدينا أربع دوال تجميع للوعود في إكماسكربت. كما في الجدول التالي:
الدالة | وصف | إصدار |
---|---|---|
Promise.allSettled | تنتظر انتهاء جميع الوعود بالرفض أو التحقق | ES2020 |
Promise.all | تنتهي عند رفض أول وعد | ES2015 |
Promise.race | تنتهي عند تحقق أو رفض أول وعد | ES2015 |
Promise.any | تنتهي عند تحقق أول وعد | ES2021 |
WeakRefs
هذا التعديل أضاف كائنين جديدين هما WeakRef
و FinalizationRegistry
. يمكن استخدام هذين الكائنين للتحكم بعملية إدارة الذاكرة والتعامل مع جامع القمامة إلى حد ما. بشكل عام لا ينصح باستخدامهما إلا في حالات خاصة جداً ولا تظهر الحاجة لهما في أكواد التطبيقات.
Logical Assignment Operators
عوامل الإسناد المنطقية هي مجموعة عوامل تسمح باختصار بعض تعليمات الإسناد إلى شكل أقصر مع تحسين الأداء بشكل طفيف (لكن لا يغرنك الmicro-optimization). في المثال التالي، وضعنا كل تعليمة إسناد جديدة ويليها تعليمتين قديمتين: الأولى مكافئة تماماً، والثانية مكافئة في الناتج ولكنها تسبب عملية إسناد زائدة أحياناً.
Numeric separators
أضيفت إمكانية استخدام الشرطة السفلية ( _
) للفصل بين الخانات عند تعريف الأعداد والثوابت، بهدف تسهيل قرائتها على المبرمج.
إضافات ES2020
String.prototype.matchAll
تستقبل هذه الدالة تعبيراً منتظماً RegExp وتعيد مكرراً Iterator يمكننا من الوصول لكافة نتائج مطابقة التعبير المنتظم في السلسلة المحرفية. يجب أن يستعمل التعبير المنتظم المستخدم في البحث رمز g
، وإذا تم تمرير كائن من نوع آخر فسيتم تحويله إلى تعبير منتظم باستدعاء الباني new RegExp()
.
يمكن معالجة النتائج عبر حلقة for...of
على المكرر، أو بتحويله إلى مصفوفة عادية باستخدام عامل النشر ...
أو الدالة Array.from
.
import()
دالة الاستيراد الديناميكي، هي دالة جديدة تسمح باستيراد الملفات بنفس أسلوب تعليمة import
ولكن مع بعض الاختلافات:
-
السماح باستخدام القوالب الحرفية بالإضافة للسلاسل النصية العادية، هذا يسمح باستيراد أكواد مختلفة ديناميكياً اعتماداً على قيم بعض المتغيرات، كاختلاف لغة الواجهة على سبيل المثال:
-
يمكن استخدامها ضمن أي نوع من السكربتات في أي مكان وليس فقط ضمن الموديولات modules.
-
تسمح باستيراد الأكواد شرطياً (ضمن تعليمة
if
مثلاً) أو استيراد وحدات ثانوية ضمنtry/catch
مع استمرار التطبيق بالعمل في حال عدم نجاح الاستيراد. -
استخدام دالة
import()
لا يسبب اعتمادية على الوحدات التي يتم استيرادها. بالتالي لا يشترط تحميل الاعتمادية وتنفيذها قبل تنفيذ السكربت الذي يستوردها.
BigInt
كائن يسمح بتمثيل الأعداد الصحيحة الأكبر من الحجم الأقصى الذي يمكن تخزينه في المتغيرات من نوع Number
، أي التي تزيد عن 253-1. يمكنك إنشاء كائن BigInt جديد بإضافة حرف n
إلى نهاية الرقم، أو باستدعاء دالة البناء BigInt()
.
يمكن استخدام العوامل الحسابية +
-
*
/
**
على الأعداد من نوع BigInt
، بشرط أن يكون الطرفين من النوع نفسه وعدم الخلط مع Number
. انتبه أيضاً إلى أن دوال الصنف Math
كلها غير متوافقة مع BigInt.
أما المقارنة المنطقية بين BigInt و Number فهي ممكنة.
Promise.allSettled
تأخذ هذه الدالة مجموعة كائنات وعود ضمن كائن مكرر (مثل مصفوفة) وتعيد وعداً جديداً. تحسم نتيجة الوعد الجديد عندما تحسم (settle) نتائج كل الوعود المدخلة إما بالتحقق fulfill أو الرفض reject.
عند معرفة كل النتائج، تحسم نتيجة الوعد الجديد الذي أعادته الدالة، ويعطي مصفوفة كائنات كل منها يمثل نتيجة من نتائج الوعود المدخلة.
إذا كانت الوعود المدخلة تعتمد على بعضها، فربما عليك استخدام Promise.all
التي أضيفت في ES2015. الاختلاف هو أن تلك الدالة تعيد وعداً يرفض ما أن ترفض قيمة أحد الوعود المدخلة ولا تنتظر حسم بقية النتائج في تلك الحالة.
globalThis
هذه القيمة تشير دوماً إلى الكائن العام this
، أي أنها تشير إلى كائن window
في المتصفحات، وكائن self
في عاملات الويب Web Workers، وكائن global
في Node.js.
for-in mechanics
أعيد النظر في ترتيب التكرار على الكائنات عند استخدام حلقة for...in
. في البيئات التنفيذية المتوافقة مع هذا التعديل، ستتوافق حلقة for-in مع الطرق الأخرى عند التكرار على الكائنات بدلاً من المعيار القديم حيث كان سلوك for-in مفتوحاً للتطبيق بصور مختلفة بين المتصفحات والبيئات المختلفة.
بشكل عام، حلقة for...in
هي من التعليمات التي يفضل تجنبها بشكل كامل بسبب فائدتها المحدودة وتوفر تعمليات بديلة أفضل منها، مثل for...of
و forEach
.
Optional Chaining
أضيف عامل جديد هو عامل الترابط الاختياري ( ?.
)، الذي يدعى أيضاً عامل الوصول الآمن، أو عامل الوصول المشروط، أو عامل أمان القيم الفارغة في لغات البرمجة الأخرى. هذا العامل يسمح بمحاولة الوصول إلى فروع المتغيرات دون التحقق أولاً من أنها تحوي قيماً معرفة.
إذا كان المتغير الأصل معرفاً، ستعاد محتويات المتغير الفرعي، أما إذا كان الأصل غير معرف (قيمته null أو undefined)، فسوف تعاد القيمة undefined بدلاً من إطلاق خطأ.
يمكن استخدامه للوصول بشكل آمن إلى خاصية في كائن، أو قيمة في مصفوفة، أو استدعاء دالة على كائن، أو استدعاء دالة يحتمل ألا تكون معرفة.
Nullish coalescing Operator
عامل استبدال المتغيرات غير المعرفة ( ??
)، يمكنك من استبدال قيمة المتغير بقيمة أخرى إذا وفقط إذا كانت قيمة المتغير هي null أو undefined.
يعمل هذا العامل بشكل مشابه لعامل (أو) المنطقية ||
، لكنه لا يستبدل القيم المعرفة التي تحول إلى قيمة false منطقية. يعني، قيم 0 أو السلسلة النصية الفارغة وغيرها من القيم الخاطئة منطقياً falsey لا تستبدل مع عامل ??
.
import.meta
تعليمة import.meta
تسمح بالوصول إلى معلومات متعلقة بالسياق أو البيئة التي تم استدعاء وحدة جافاسكريبت وتنفيذها فيها.
يمكن على سبيل المثال استخدامها للوصول إلى رابط الاستدعاء url وأي بارمترات معرفة في ذلك الرابط، أو الوصول إلى خصائص على وسم <script>
الذي استدعى الملف، أو معرفة مسار الملف المستدعى في نظام الملفات الجهاز المستضيف، وغير ذلك من معلومات بيئة تنفيذ الموديول.
مثال آخر:
إضافات ES2019
Object.fromEntries
تأخذ هذه الدالة مجموعة أزواج [مفتاح، قيمة] وتنشئ كائناً جديداً منها. مجموعة الدخل يمكن أن تكون مصفوفة أو Map أو أي كائن Iterable.
String.prototype.{trimStart,trimEnd}
تستخدم الدالة trimStart
لإزالة المحارف الفارغة من بدايات السلاسل المحرفية ( مثل محرف المسافة أو المسطرة space، علامة الجدولة tab، المسافة غير المنقسمة non-breaking space، وغيرها بالإضافة لإزالة محارف السطر الجديد CR
LF
الخ)، أما trimEnd
فتزيلها من نهايات السلاسل المحرفية.
الأسماء القياسية هي trimStart
/trimEnd
، لكن هناك اسمين مستعارين لهاتين الدالتين هما trimLeft
/trimRight
تم الحفاظ عليهما لأغراض التوافق مع بعض المتصفحات التي أضافت هذه الدوال قبل إدراجها في المعيار القياسي في 2019.
دالة trim
التي تحذف المحارف الفارغة من طرفي السلسة سبقت إضافتها في ES5 عام 2009.
Array.prototype.{flat,flatMap}
إضافة دالتي flat
و flatMap
إلى كائن المصفوفة.
دالة flat
تفرد عناصر المصفوفات الفرعية وتضمها إلى المصفوفة الأم التي تحويها (تعيد الناتج بشكل مصفوفة جديدة ولا تعدل على مصفوفة الدخل). تأخذ الدالة برامتراً يحدد عمق المصفوفات التي سيتم دمجها في مستوى واحد.
دالة flatMap
تكافئ استدعاء map
يتبعها استدعاء flat(1)
على المصفوفة الناتجة.
Optional catch binding
هذا التعديل يسمح لك بكتابة الصيغة التالية:
بدلاً من:
الصيغة الأولى الجديدة مفيدة في حال لم تكن تستعمل المتغير err
في بلوك catch
أو إذا كنت تريد تجاهل أي نوع من الأخطاء تماماً بإضافة بلوك catch
فارغ، حيث لم تعد هناك ضرورة لتعريف المتغير إذا لم ترغب باستخدامه.
JSON superset
رغم أن إكماسكربت تسمح بكتابة JSON بشكل مباشر ضمن الكود المصدري، إلا أن هناك محرفين (هما U+2028 ـ LINE SEPARATOR و U+2029 ـ PARAGRAPH SEPARATOR) يسمح بكتابتهما في السلاسل النصية في JSON دون تهريب لكنهما ممنوعان في السلاسل النصية في إكماسكربت.
هذا التعديل جعل هذين المحرفين مسموحين، وبالتالي يمكن تضمين أي JSON سليم ضمن أكواد إكماسكربت دون مشاكل. بهذا يصبح JSON مجموعة جزئية محتواة في إكماسكربت (أي أن JSON ⊂ ECMAScript).
Symbol.prototype.description
إضافة خاصية description
إلى كائنات الرموز Symbol
، هذه الخاصية تعيد وصف الرمز بشكل مباشر بدلاً من الاضطرار للوصول إليها بشكل غير مباشر باستخدام toString
.
مراجعة Function.prototype.toString
تعديل على طريقة عمل دالة toString
عند استدعائها على الدوال. الهدفان الأساسيان هما إعادة النص المصدري للدالة في حال كان ذلك ممكناً، بصيغة سليمة وقابلة للتنفيذ. الهدف الثاني، في حال تعذر إعادة شفرة برمجية سليمة، يجب إعادة سلسلة غير صالحة نحوياً، أي أنها ستسبب SyntaxError
في حال محاولة تنفيذها باستخدام eval
.
Well-formed JSON.stringify
تصحيح مشكلة في عمل دالة JSON.stringfy
حيث كانت تعيد سلاسل نصية غير متوافقة مع معيار UTF-8 ولا معيار UTF-16 إذا وجدت بعض المحارف الخاصة (ضمن النطاق U+D800 حتى U+DFFF) في بيانات الدخل.
إضافات ES2018
تعديل على القوالب الحرفية
القوالب الحرفية Template literals هي سلاسل محرفية خاصة يمكنك فيها طباعة قيم بعض المتغيرات أو تنفيذ عمليات حسابية بهدف طباعة سلسلة منسقة بشكل جميل. يتم تعريف هذه السلاسل باستخدام علامة ( `
) ويمكن كتابتها على عدة سطور.
الجديد في ES2018 هو تعديل يسمح باستخدام سلاسل التهريب غير الصالحة في القوالب الحرفية الموسومة tagged template literals، بدلاً من إعادة خطأ.
في المثال السابق، التعليمة الأولى عرفنا فيها قالباً نصياً واستخدمنا \u
لتهريب محرفين من محارف يونيكود، أما التعليمة الثانية فتعطي خطأ، لأن nicode
ليس مقبولاً كمحرف يونيكود.
لكن هناك حالات تحتاج فيها للتعامل مع سلاسل التهريب غير المسموحة كما في حالة كتابة كود لمعالجة نصوص LaTeX أو ما شابه. في تلك الحالة، يمكنك وسم القالب الحرفي، وسيتم تمرير القالب كما هو دون معالجة إلى دالة الوسم حيث يمكن معالجته. انظر المثال التالي لمزيد من الإيضاح.
كما ترى، فقد تجاهلت جافاسكريبت الخطأ، ومررت السلسلة الأولى بشكلها الخام إلى دالة الوسم، أما بالنسبة للشكل المطبوخ -الذي يفترض أن تستبدل جافاسكريبت محارف التهريب فيه بقيمها المناسبة- فهو يحوي القيمة undefined
.
علامة s
في التعبيرات المنتظمة (dotAll
) [1]
تمت إضافة وضع جديد للتعبيرات المنتظمة (Regular Expressions)، حيث يتم فيه مطابقة أي محرف مع رمز النقطة: .
(من هنا سمي وضع dotAll
). الفكرة أن رمز .
في جافاسكربت لم يكن يطابق بعض المحارف رغم أنه يفترض أن يطابق “أي شيء”. بشكل أخص، رمز .
لا يطابق بعض محارف المسافات البيضاء (مثل محرف نهاية السطر ونهاية المقطع) في الحالة الافتراضية. كما أن المحارف الفلكية (astral characters) في يونيكود لا تطابق مع رمز .
إلا باستخدام الرمز s
لتفعيل نمط dotAll
مع إضافة الرمز u
من أجل يونيكود.
تسمية المجموعات في RegExp
في التعبيرات المنتظمة، يمكن تعريف “مجموعات التقاط capture groups” تمثل أجزاءاً محددة من السلسلة المحرفية التي يطابقها التعبير المنتظم.
سابقاً، كانت الطريقة الوحيدة للتعامل مع مجموعات الالتقاط هي باستخدام أرقامها، حيث ترقّم المجموعات تسلسلياً حسب ترتيب ورودها بدءاً من الصفر. المثال التالي فيه تعبير منتظم يطابق التواريخ المكتوبة حسب صيغة ISO المعيارية ويستخدم مجموعات الالتقاط للتعامل مع السنة والشهر واليوم بشكل منفصل:
لكن مع هذا التغيير أصبح اسناد تسميات للمجموعات ممكناً، مما يسهل التعامل معها، كما أن هذا يحل مشكلة تغير الرقم الدال على مجموعة ما إذا تغير ترتيب تعريف المجموعات في التعبير المنتظم (كأن نستخدم تعبيراً لمطابقة صيغة تاريخ أخرى ترتيب الشهر واليوم والسنة فيها مختلف).
لتسمية مجموعة التقاط ما، نستخدم الصيغة التالية (?<name> … )
، مع الأخذ بعين الاعتبار أن الاسم يجب أن يحقق شروط تسمية المتغيرات العادية (يتكون من حروف وأرقام و _
فقط ولا يبدأ برقم):
يمكن أيضاً استخدم صيغة التفكيك destructring مع هذه الصيغة، كما يلي:
RegExp Lookbehind Assertions
أضيفت تأكيدات البحث الخلفي في التعبيرات المنتظمة كمتمم لتأكيدات البحث الأمامي الموجودة سابقاً (Lookahead Assertions).
تكتب هذه التأكيدات وفق الصيغة التالية (?⇐y)x
للتأكيد الخلفي المثبت (أو الموجب Positive lookbehind assertion)، حيث تتم مطابقة التعبير المنتظم x
فقط إذا كان مسبوقاً بسلسلة محارف تطابق التعبير y
. أما التأكيد الخلفي المنفي (أو السالب Negative lookbehind assterion) فيأخذ الصيغة (?<!y)x
وهو يستخدم لمطابقة التعبير x
إذا وفقط إذا لم يكن مسبوقاً بسلسلة محارف تطابق التعبير y
.
مثلاً، لمطابقة سعر منتج ما ضمن نص قد يحوي أرقاماً أخرى لا تمثل أسعاراً، وعلى فرض أن السعر يسبق برمز عملة الدولار $
، يمكننا استخدام التعليمات التالية:
RegExp Unicode Property Escapes
هذا التغيير يضيف طريقة جديدة لمطابقة محارف يونيكود في السلاسل المحرفية حسب اسم اللغة أو حسب تصنيف المحارف في معيار يونيكود. هذا التغيير يسمح بمطابقة المحارف التي تنتمي لمجموعة معينة أو لغة ما دون تعريف مجالات يونيكود أو استخدام مكتبات خارجية.
في المثال التالي، لدينا ثلاثة تعابير منتظمة كلها تطابق مجموعات الحروف العربية الواردة في السلسلة المحرفية، الأول يستخدم الصيغة الجديدة، بينما التعبير الثاني والثالث يستخدمان الصيغ القديمة:
التعامل مع الصيغة الجديدة أسهل ولا حاجة لمعرفة مجالات الحروف المراد مطابقتها، كما أنها تحدث تلقائياً مع الزمن كلما طرأت تغييرات وتحديثات على معيار يونيكود.
تكتب هذه الصيغة بالشكل \p{ … }
(حرف p
صغير) للمطابقة مع الخاصية التي تكتبها بين القوسين، أو بالشكل \P{ … }
(حرف P
كبير) لنفي التطابق مع الخاصية المحددة بين القوسين.
يمكنك مطابقة المحارف حسب اللغة (Script)، أو حسب خاصية يونيكود (Unicode property). من الخصائص المدعومة:
استخدام عامل التفكيك والنشر ...
مع الكائنات
عامل النقط الثلاث ...
يسمح بتفكيك المصفوفات والكائنات إلى مكونات فرعية أثناء عملية الإسناد أو تعريف متغير جديد. كما يسمح بنشر محتويات المصفوفة وتمريرها في الأماكن التي تتوقع استقبال صفر أو أكثر من العناصر (مثل استدعاء دالة أو تعريف مصفوفة جديدة)، أو نشر محتويات الكائن وتمريرها بشكل مجموعة من أزواج key-value إلى التعليمات التي تتوقع استقبالها.
الجديد في ES2018 هو دعم التعامل مع الكائنات (سابقاً كان يعمل مع المصفوفات وبارامترات الدوال).
عامل النشر يتجاهل القيم البوليانية الخاطئة (falsey values)، وهذا يسمح بدمج بعض الخصائص في كائن جديد شرطياً:
Promise.prototype.finally
هذا المُتناوِل handler يستقبل دالة تستدعى عند حسم نتيجة الوعد، رفضاً أو تحققاً. يفيد استخدامه لتجنب تكرار الكود الذي نريد تنفيذه في حالتي then
و catch
.
Asynchronous Iteration
إضافة المكررات غير المتزامنة. هناك مقالة تشرحها على أكاديمية حسوب.
إضافات ES2017
Object.values
تعيد هذه الدالة مصفوفة تحوي كافة القيم التي يحويها الكائن الممرر لها.
Object.entries
تعيد هذه الدالة مصفوفة فيها مصفوفات جزئية. كل مصفوفة جزئية تكافئ مدخلة واحدة في الكائن، وتحوي عنصرين هما المفتاح والقيمة لتلك المدخلة.
هذه الدالة مفيدة عند الرغبة بالتكرار على كل المدخلات في الكائن وتفيذ عملية ما تحتاج الوصول إلى المفتاح والقيمة معاً. قارن بين الأمثلة التالية التي تطبع مفاتيح وقيم مدخلات الكائن object1
:
String.prototype.padEnd / String.prototype.padStart
دوال حشو السلاسل النصية. تستخدم لتمديد طول السلسلة إلى الطول الحدد من المحارف بإضافة فراغات أو بتكرار السلسلة النصية الممرة كمتغير ثان للدالة.
انظر أيضاً trimStart
و trimEnd
التي أدرجت في إكماسكربت 2019
Object.getOwnPropertyDescriptors
دالة جديدة متممة لعمل الدالة المفردة Object.getOwnPropertyDescriptor
. هذه الدالة تعيد واصفات كافة الخواص المعرفة ضمن الكائن نفسه.
الفواصل الإضافية في نهاية بارمترات الدوال عند التعريف أو الاستدعاء
الفاصلة الإضافية هي علامة ( ,
) التي توضع بعد العنصر الأخير في المصفوفة أو الكائن أو مجموعة بارامترات الدالة عند تعريفها أو استدعائها. كتابة الفاصلة الإضافية غير مسموحة في JSON، لكنها كانت مسموحة في تعريف المصفوفات في جافاسكربت منذ بداية عهدها، ثم تم السماح بإضافة الفاصلة النهائية إلى تعريفات الكائنات في ES5 وإلى قائمة بارمترات الدوال في ES2017.
لا يسمح باستخدام الفاصلة الإضافية في تعريف الدالة إذا لم تكن لها أي بارمترات.
async / await
يمكن تعريف الدوال اللامتزامنة باستخدام الكلمة المفتاحية الجديدة: aync
. ضمن هذه الدوال، يمكنك استخدام الكلمة المفتاحية await
لانتظار حسم نتيجة وعد ما (Promise) وتخزينها في متغير بدلاً من استخدام سلاسل طويلة من استدعاءات then
وكتابة دوال متداخلة. هذه الطريقة تؤدي لكتابة أكواد أنظف، كما تسمح باستخدام بلوكات try / catch
حول استدعاءات الوعود.
كل الدوال التي تعرف بالكلمة المفتاحية async
هي كائنات من نوع AsyncFunction
. القيمة التي تعيدها الدالة اللامتزامنة هي دوماً من نوع Promise. إذا كانت الدالة تعيد قيمة أخرى فسوف تغلف تلقائياً ضمن Promise.
مشاركة الذاكرة و Atomics
أضيف كائن SharedArrayBuffer
الذي يسمح بمشاركة الذاكرة بين السكربت الرئيسي وبين عمال الويب (Web Workers) الذين يتخاطب معهم. كما أضيف كائن Atomics
الذي يوفر عمليات ذرية (غير قابلة للمقاطعة) لاستخدامها في مزامنة الذاكرة المشتركة بين خيوط المعالجة التي تتعامل معها.
إضافات ES2016
Array.prototype.includes
تستخدم هذه الدالة لمعرفة إذا كانت المصفوفة تحوي قيمة ما ضمن مدخلاتها، وتعيد القيمة true
أو false
.
عامل الرفع إلى قوة **
يعطي ناتج رفع العدد الأول إلى قوة العدد الثاني. أي الأساس ** الأس. ناتج العملية يكافئ ناتج استدعاء الدالة Math.pow
، لكنه يتميز عنها بأنه يدعم الأعداد من نوع BigInt. هذا العامل أيضاً يخضع لتحسينات الأداء بشكل أفضل من Math.pow
في بعض الحالات مما قد يعطي أداء أعلى نسبياً.