بررسی ویژگی‌های جدید ECMAScript 2020

ECMAScript 2020 New features
ECMAScript 2020 New features

چند روزی میشه که نسخه‌ی پایدار Node.js به نسخه‌ی v14 بروزرسانی شده. با این بروزرسانی علاوه بر بهبود‌های مختلف ما می‌تونیم از ویژگی‌های ECMAScript 2020توی کدهامون به صورت پایدار استفاده کنیم. این کار کمکمون میکنه که کدهای بهتر و پایدارتری بنویسیم. با هم قراره که این ویژگی‌ها رو توی این نوشته بررسی کنیم.

جدول 1 زمانی نسخه های مختلف NodeJS
جدول 1 زمانی نسخه های مختلف NodeJS


پراپرتی امن یا (?.) Optional Chaining operator

تا قبل از نسخه 2020 برای اینکه null error exception نخوریم مجبور بودیم null نبودن تمام پراپرتیهای درونی یک شی رو با نوشتن یک عالمه if چک کنیم. حالا با اومدن این ویژگی همه چی به شکل آب خوردن شدنه!

const employee = {
name: &quotAlice&quot,
};

const person = employee.address?.city;
console.log(person);
// results in undefined as city is not existing in employee object

اپراتور جایگزینی مقادیر نال یا (??) Nullish coalescing operator

با استفاده از این اپراتور میتونیم مشخص کنیم که اگر مقدار سمت چپ عبارت برابر با nullیا undefined بود با مقدار سمت راست عبارت جایگزین بشه.

const person = null ?? &quotmy Name&quot
console.log(person);
// prints &quotmy Name&quot

const myNumber = 0 ?? 42;
console.log(myNumber)
// prints 0


ویژگی Dynamic imports

در جاوااسکریپت import کردن یک ماژول تا به حال صورت کاملا strict و static صورت میپذیرفت. بعد از کلمه‌ی کلیدی import ما فقط مجاز به استفاده از یک رشته متنی بودیم و به طور مثال حق استفاده از یک تابع رو نداشتیم.

import ... from getModuleName();//Error, only from &quotstring&quot is allowed

یا نمیتونستیم به صورت dynamic مقدار import رو تغییر بدیم.

if (...) {
  import ...; // Error, not allowed!
} else {
   import ...; // Error, we can't put import in any block
}

که البته مزیتهای زیادی توی آنالیز یا bundle بهتر کد در اختیار ما میگذاشت. حالا با استفاده از عبارت ()import این موضوع تغییر کرده و ما میتونیم به صورت پویا یک ماژول رو import کنیم و این کار رو هر قسمت از کد هم می‌تونیم انجام بدیم.

const moduleToImport = &quot./dir/myModule.js&quot
import(moduleToImport).then((module) => module.myFun());

با استفاده از عبارت import() ما یک promise به دست میاریم.

افزوده شدن پشتیانی از Bigint و Uint64

تا قبل از ECMAScript 2020 نسخه‌ی استاندارد ECMAScript برای پشتیبانی از اعداد وابسته به مقدار 64-bit floating point numbers بود. اما از این نسخه به بعد اعداد بدون اعشار نوع اختصاصی خودشون به نام bigint رو پیدا کردند.

console.log(typeof 123n)
// &quotbigint&quot


ویژگی () String.prototype.matchAll

در ECMAScript 2020 متد () matchAll به نوع String اضافه شده. این متد عبارت‌های match شده یک regular expression رو به صورت یکدفعه برمیگردونه.

let regexp = /t(e)(st(\d?))/g;
let str = &quottest1test2&quot
let array = [...str.matchAll(regexp)];
console.log(array[0]);

// [&quottest1&quot,&quote&quot,&quotst1&quot,&quot1&quot]


ویژگی Promise.allSettled

این ویژگی به ما کمک میکنه که پس از حل شدن وضعیت تمام Promiseهای وابسته اعم از اینکه resolve بشن یا اینکه reject بشن یک Promise صادر بشه. اینجوری ما متوجه میشیم که Promiseهای وابسته به سرانجام خودشون رسیدند و کارهای بعدی رو میتونیم از سر بگیریم.

const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) =>
            setTimeout(reject, 100, &quotfoo&quot)
);
const promises = [promise1, promise2];
Promise.allSettled(promises).then((results) =>
              results.forEach((result) => console.log(result.status)));
// expected output:
// &quotfulfilled&quot
// &quotrejected&quot


ویژگی Runtime Independent globalThis

به صورت تاریخی برای دسترسی به شی global در محیط مختلف اجرای جاوا اسکریپت نیازمند Syntaxهای متفاوت بود. برای مثال توی web میتونستیم از window، self و یا frame با با توجه به محیط اجرای کدمون استفاده کنیم. در حالی که هیچ کدوم از کلمات کلیدی بالا در محیط nodejs کاربردی نداشت و در این محیط باید از کلمه‌ی کلیدی global استفاده می‌کردیم. توی ECMAScript 2020 با استفاده از کلمه‌ی کلیدی globalThis این مشکل حل شده.


منابع: + و + و + و +.