Muhammet Sait » مقالات

الجديد في إكماسكربت 2019

نستعرض هنا ملخصاً للتعديلات الجديدة على توصيف إكماسكربت عام 2019، هذه المقالة جزء من مجموعة تغطي مجمل الإضافات والتعديلات الداخلة على المعيار القياسي للغة جافاسكربت في السنوات الماضية.

تعديلات إكماسكربت عام 2020

تعديلات إكماسكربت عام 2021

إضافات ES2019

# Object.fromEntries

تأخذ هذه الدالة مجموعة أزواج [مفتاح، قيمة] وتنشئ كائناً جديداً منها. مجموعة الدخل يمكن أن تكون مصفوفة أو Map أو أي كائن Iterable.

const obj = Object.fromEntries([
  ['foo', 'bar'],
  ['baz', 42]
]);

console.log(obj);
// expected output: Object { foo: "bar", baz: 42 }

# 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 تفرد عناصر المصفوفات الفرعية وتضمها إلى المصفوفة الأم التي تحويها (تعيد الناتج بشكل مصفوفة جديدة ولا تعدل على مصفوفة الدخل). تأخذ الدالة برامتراً يحدد عمق المصفوفات التي سيتم دمجها في مستوى واحد.

const arr1 = [0, 1, 2, [3, 4]];

console.log(arr1.flat());
// expected output: [0, 1, 2, 3, 4]

const arr2 = [0, [1, 2], 5, [[11, [3, 4]], 12], 6];
 
console.log(arr2.flat(2));
// expected output: [0, 1, 2, 5, 11, [3, 4], 12, 6]

دالة flatMap تكافئ استدعاء map يتبعها استدعاء flat(1) على المصفوفة الناتجة.

# Optional catch binding

هذا التعديل يسمح لك بكتابة الصيغة التالية:

try {
...
} catch {
...
}

بدلاً من:

try {
...
} catch (err) {
...
}

الصيغة الأولى الجديدة مفيدة في حال لم تكن تستعمل المتغير 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.

Symbol('desc').toString();   // "Symbol(desc)"
Symbol('desc').description;  // "desc"
Symbol('').description;      // ""
Symbol().description;        // undefined

# مراجعة Function.prototype.toString

تعديل على طريقة عمل دالة toString عند استدعائها على الدوال. الهدفان الأساسيان هما إعادة النص المصدري للدالة في حال كان ذلك ممكناً، بصيغة سليمة وقابلة للتنفيذ. الهدف الثاني، في حال تعذر إعادة شفرة برمجية سليمة، يجب إعادة سلسلة غير صالحة نحوياً، أي أنها ستسبب SyntaxError في حال محاولة تنفيذها باستخدام eval.

# Well-formed JSON.stringify

تصحيح مشكلة في عمل دالة JSON.stringfy حيث كانت تعيد سلاسل نصية غير متوافقة مع معيار UTF-8 ولا معيار UTF-16 إذا وجدت بعض المحارف الخاصة (ضمن النطاق U+D800 حتى U+DFFF) في بيانات الدخل.