0

JavaScript 2021: ویژگی های جدید

JavaScript یک زبان برنامه نویسی آسان  است که به همین دلیل یادگیری آن  برای مبتدیان مناسب می کند. در طول سال ها ، js انقدر  پیشرفت کرده است که تقریباً در همه جا وجود دارد. ما آن را در قسمت فرانت (React ، Angular یا Vue.js) ، بک اند (Node.js) ، برای ایجاد یک برنامه دسکتاپ با ElectronJS و … مشاهده کرده ایم.

 

جاوا اسکریپت در سال 2021 برخی از ویژگی های جدید را ارائه داده است که از بسیاری جهات به توسعه دهندگان کمک می کند. برخی از ویژگی های جدید JavaScript در سال 2021 عبارتند از:

 

1) اپراتورهای منطقی جدید

جاوا اسکریپت سه عملگر منطقی جدید را به مجموعه خود اضافه کرده است. این سه عملگر =&& و =|| و  =?? هستند. بیایید در مورد این اپراتورها به طور دقیق بحث کنیم:

الف: اپراتور =&&

قبل از عمیق شدن در توضیح ، نگاهی به مثال کد زیر بیاندازید:

let a = 1;
let b = 2;
a &&= b;
console.log(a) // output for variable 'a' would be 2.

خط a&& = b مشابه بلاک کد آورده شده در زیر است:

if(a) {
 a = b;
}

این اپراتور منطقی می گوید اگر متغیر a دارای ارزش true باشد ( دارای مقدار غیر صفر ) ، پس باید به متغیر a مقدار  b اختصاص داده شود. به همین دلیل است که وقتی console.log (a) را انجام می دهیم ، مقدار متغیر a به جای 1 به 2 ارزیابی می شود.

 

ب:اپراتور =||

بلاک کد زیر را در نظر بگیرید:

let a = 1;
let b = 2;
a ||= b;
console.log(b); // output for variable 'a' would be 1.

این عملگر مخالف عملگر =&& است. در اینجا ، متغیر a فقط با متغیر b برابر خواهد بود تنها اگر متغیر a مقدار نادرستی داشته باشد. کد بالا معادل کدی است که در زیر آورده شده است:

if (!a) {
 a = b;
}

پ:اپراتور =??

این عملگر بررسی می کند که آیا مقداری پوچ  یا تعریف نشده است. به مثال زیر توجه کنید:

let a;let b = 2; a ??= 1; console.log(a) // output for variable 'a' would be 1.// this code block is similar to the code given above. // if(a === null || a === undefined) { // a = 1 // }

در مثال داده شده ، مقدار متغیر “a”  تعریف نشده ارزیابی می شود بنابراین ، شرط if  true ارزیابی می شود و  به “a” مقدار 1 اختصاص می یابد.

 

2) روش ‘replaceAll‘ رشته ای

همه ما برای جایگزینی یک کاراکتر یا کلمات در یک رشته با عنصر مشخص شده از روش string replace استفاده کرده ایم. اما با  کار با یک محدودیت همراه بود ، این روش فقط جایگزین اولین مکان  وقوع کاراکتر یا کلمه ای شد که می خواستیم جایگزین آن شود و

بقیه موارد در رشته به همان شکل باقی میماند. برای جایگزینی تمام کاراکترها یا کلمات ، باید از عبارات منظم استفاده میشد.

مثال:

// without regexlet str = 'JS is everywhere. JS is amazing!'; console.log(str.replace('JS', 'JavaScript')); // the output would be 'JavaScript is everywhere. JS is amazing!'// with regex let str = 'JS is everywhere. JS is amazing!'; console.log(str.replace(/JS/g, 'JavaScript')); // the output would be 'JavaScript is everywhere. JavaScript is amazing!'.

با استفاده از روش replaceAll ، نیاز به عبارت منظم برطرف می شود. کد زیر را در نظر بگیرید:

 

let str = 'JS is everywhere. JS is amazing!';
console.log(str.replaceAll('JS', 'JavaScript')); // the output would be 'JavaScript is everywhere. JavaScript is amazing!'.

متد replaceAll با عنصری  که ما مشخص کردیم همه  کاراکتر یا کلمات مشخص شده را جایگزین می کند.

 

3) استفاده از underscores به عنوان جدا کننده برای اعداد صحیح

اعداد صحیح یکی از انواع داده ها در میان رشته ها ، آرایه ها و … است. گاهی اوقات اعداد صحیح آنقدر بزرگ می شوند که شمارش تعداد عناصر موجود یا تشخیص اینکه عدد میلیون یا میلیارد عدد است تقریباً دشوار می شود.

با معرفی این ویژگی ، ما می توانیم خوانایی عددهای صحیح خود را بهبود ببخشیم. بدون اینکه نوع داده را به رشته تبدیل کنیم ، می توانیم از زیرخط ها( underscores) برای جدا کردن ارقام استفاده کنیم. مثال:

 

let number = 1_000_000_000; // one billion
console.log(number) // 1000000000 (the number would remain an integer)

4) ‘()Promise.any’

()Promise.any  ویژگی جدیدی است که چندین پرامیس قابل پیمایش را می گیرد و پرامیسی را که ابتدا تحقق می یابد ، برمی گرداند. یک مثال این مسئله را برای شما روشن می کند:

 

const p1 = new Promise(resolve => setTimeout(resolve, 500, 'First'));const p2 = new Promise(resolve => setTimeout(resolve, 800, 'Second')); const p3 = Promsie.reject(1);const promises = [p1, p2, p3];Promise.any(promises) .then(result => { console.log(result); }) // the result would be 'First' because that's the promise, that is fulfilled first. .catch(e => { console.log(e); })
 

 

در صورت تحقق هیچ یک از پرامیس ها ، یک AggregateError دریافت خواهیم کرد. برای رسیدگی به AggregateError ، ما یک دستور catch را بعد از دستور then تعریف خواهیم کرد.

 

5) WeakRef و Finalizers

WeakRef مخفف ‘Weak References است. WeakRef اجازه می دهد تا یک رفرنس ضعیف به یک شی داشته باشید. رفرنس ضعیفی که انجام می شود “هدف” نامیده می شود. رفرنس ضعیف مانع از بازیافت مجدد شی توسط  garbage collector نمی شود.

جمع آوری زباله روشی برای جمع آوری متغیرهایی است که دیگر نیازی به آنها نیست ، بنابراین حافظه کامپیوتر را آزاد می کند. برای کسب اطلاعات بیشتر در مورد جمع آوری زباله ، روی لینک اینجا کلیک کنید.

 

توجه: WeakRef فقط باید پس از بررسی صحیح  مورد استفاده قرار گیرد و هر زمان امکان پذیر باشد باید از آن اجتناب شود.

اجازه دهید موارد بالا را با یک مثال درک کنیم:

const weakRefFunc = () => {
 const obj = new WeakRef({
 name: 'JavaScript'
 });
 console.log(obj.deref().name);
}
const test = () => {
 new Promise(resolve => {
 setTimeout(() => {
 weakRefFunc();
 resolve();
 }, 3000)
 })
 new Promise(resolve => {
 setTimeout(() => {
 weakRefFunc();
 resolve();
 }, 5000)
 })
}
test();

متد deref هدفی را که نگه داشته شده برمی گرداند ، اگر هدف garbage-collected شده باشد ،  تعریف نشده برگشت داده می شود.

در این مثال ، متغیر obj رفرنس ضعیفی است که نگه داشته می شود.

اولین بار که weakrefFunc در داخل تابع test فراخوانی می شود ، تضمین می شود که “JavaScript” چاپ شود ، اما برای بار دوم وقتی فراخوانی می شود ، هیچ تضمینی وجود ندارد که “JavaScript” چاپ شود زیرا متغیر obj می تواند garbage-collected باشد

،با توجه به اینکه به عنوان weakrefFunc در نظر گرفته شده است .

 

Finalizers

Finalizer بیشتر با WeakRef استفاده می شود اما به صورت جداگانه نیز قابل استفاده است. Finalizer می گوید چه موقع یک شی  garbage collected می شود. بیایید این را از طریق یک مثال درک کنیم:

→ ابتدا ، ما می خواهیم با استفاده از روش FinalizationRegistry یک Finalizer ایجاد کنیم.

const registerFinalizer = new FinalizationRegistry(data => console.log(data));const obj = {'name': 'JavaScript'};registerFinalizer.register(obj, 'obj is collected now!')

اکنون ، متغیر RegisterFinalizer یک شی است که شامل متد register است که ما قصد استفاده از آن را داریم.

RegisterFinalizer.register  دو آرگومان می گیرد. اولین ، شیئی که قرار است برای garbage collection دنبال شود ، و دوم پیامی است که می خواهیم هنگام garbage collected ، آن را به کنسول نمایش دهیم.

اکنون ، هنگامی که متغیر obj در برنامه garbage collected می شود ، پیامی با عنوان “!obj is collected now” در کنسول چاپ می شود.

 

نتیجه گیری

جاوا اسکریپت به طور کلی یک زبان شگفت انگیز برای یادگیری است ، یکی از دلایل اصلی آن این است که در همه جا وجود دارد. به نظر من این ویژگی های جدید که در بالا اشاره شدند بسیار مفید هستند. ویژگی های جاوا اسکریپت 2021 بسیار شگفت انگیز است

و من انتظار دارم که سال آینده نیز چنین اتفاقی بیفتد.

 

ارسال دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *