نکات برجسته ECMAScript 2021 برای شروع عبارتند از ()placeAll()، premt.any()، AggregateError، و عملگرهای تخصیص منطقی جدید. شیرجه بزنیم
- String.prototype.replaceAll
- promise.any()
- AggregateError
- اپراتورهای تخصیص منطقی جدید
- WeakRef
- FinalizationRegistry
- جداکنندههای لفظی عددی
- بهبودهای Array.prototype.sort
مشخصات زبان جاوا اسکریپت که با نام ECMAScript یا ES نیز شناخته میشود، یک سند زنده است که هر سال در پاسخ به نیازهای در حال تحول اصلاح میشود. در حالی که جاوا اسکریپت به عنوان یک زبان برنامه نویسی شروع شد، مروری بر مشخصات ECMAScript خاطرنشان می کند که این زبان “اکنون برای طیف کامل وظایف برنامه نویسی در محیط ها و مقیاس های مختلف استفاده می شود.” به همین دلیل، جاوا اسکریپت به عنوان یک هدف عمومی کاملاً مشخص بهتر درک می شود. زبان برنامه نویسی.
در حالی که نسخه آتی ECMAScript 2022 نزدیک است، بیایید نگاهی به ویژگی های زبان جاوا اسکریپت جدید معرفی شده در ECMAScript 2021 بیندازیم.
String.prototype.replaceAll
متد replaceAll()
یک رشته یا عبارت منظم به نام pattern را به عنوان اولین آرگومان خود می گیرد. آرگومان دوم جایگزینی الگو است. با توجه به آرگومان اول و دوم، replaceAll()
یک رشته جدید را برمیگرداند که رشته منبع خواهد بود و تمام نمونههای الگو با جایگزینی جایگزین میشوند. رشته منبع تحت تأثیر قرار نگرفته است.
در ECMAScript 2021، replaceAll()
به matchAll()
ECMAScript 2020 برای بهبود قابلیتهای ذاتی شی String
داخلی جاوا اسکریپت میپیوندد.
روش replaceAll()
دقیقاً مانند replace()
عمل میکند، اما به جای اولین مورد، برای همه رخدادهای رشته اعمال میشود. پس از سالها استفاده از کتابخانه یا راهحلهای کدگذاریشده دستی، این یک افزودنی خوشآمد است.
فهرست ۱ یک مثال ساده را نشان می دهد، که در آن ما مقداری شکسپیر را به هم می زنیم.
let quote = "all the world's a stage, and all the men and women merely players";
let newQuote = quote.replaceAll("all", "most of");
console.log(newQuote);
promise.any()
روش promise.any()
مجموعهای از وعدهها را میگیرد و به شما امکان میدهد با برگرداندن یک وعده جدید به اولین موردی که با موفقیت کامل شد پاسخ دهید.
اگر هر قولی رد شود، نادیده گرفته می شود. (به تضاد این روش با promise.all()
، که با هر خطا یا رد کردن متوقف می شود، و با promise.allSettled()
، که به شما امکان می دهد تمام وعده هایی که حل شده اند را رعایت کنید، توجه کنید. در یک مجموعه، حتی اگر خطاهای میانی وجود داشته باشد.)
اگر هر یک از وعدهها خطا داشته باشد، promise.any()
همچنان بر اساس اولین قول حلشده در مجموعه عمل میکند.
متد promise.any()
یک وعده رد شده را در صورتی که هیچ یک از وعدههای ارسال شده حل نشود، برمیگرداند. خطایی که باز میگرداند AggregateError
است، که یک نوع خطای جدید است که توسط ECMAScript 2021 نیز معرفی شده است. AggregateError
خلاصهای از تمام خطاهای مواجه شده را نشان میدهد.
شما می توانید از promise.any()
برای جمع آوری بسیاری از وعده ها در یک وعده استفاده کنید. این وعده با نادیده گرفتن خطاها و ردها، به هر کدام از مجموعه ها زودتر حل می شود. فهرست ۲ یک مثال ساده دارد.
const promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 1000, "1 second");
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 2000, "2 second");
});
let promises = [promise1, promise2];
Promise.any(promises).then((firstResolved) => {
console.log(firstResolved); // outputs “۱ second”
})
اکنون فهرست ۳ را در نظر بگیرید، که در آن همه وعدهها در نهایت به عنوان رد شده شکست میخورند.
const promise1 = new Promise((resolve, reject) => {
setTimeout(reject, 1000, "1 second");
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(reject, 2000, "2 second");
});
let promises = [promise1, promise2];
Promise.any(promises).then((firstResolved) => {
console.log(firstResolved);
}).catch((err) => { console.log("error: " + err) }) // outputs error: AggregateError: All promises were rejected
در فهرست ۳، یک کنترل کننده catch اضافه می کنیم که پس از رد شدن هر دو وعده فعال می شود. توجه داشته باشید که AggregateError
یک شی است که اطلاعات مربوط به وعده های ناموفق را در خود دارد.
بیایید نگاهی دقیقتر به AggregateError
بیندازیم، که یکی دیگر از ویژگیهای جدید در ECMAScript 2021 است.
AggregateError
AggregateError
نوع خاصی از زیر کلاس خطا است که بسیاری از خطاها را در یک شی خلاصه ترکیب می کند. همانطور که دیدید، روش promise.any()
در فهرست ۳ یک AggregateError
ایجاد کرد.
در آن مثال، همه وعدههای ارسال شده به promise.any()
ناموفق بود، بنابراین روش AggregateError
را برگرداند. این خطا حاوی پیامی بود که خطا را توصیف می کرد و آرایه ای با جزئیات مربوط به هر خطا. فهرست ۴ محتوای خطای بازگشتی را نشان می دهد.
AggregateError: All promises were rejected
errors: Array(2)
۰: "۱ second"
۱: "۲ second"
length: 2
message: "All promises were rejected"
stack: "AggregateError: All promises were rejected"
همانطور که نشان داده شده است، AggregateError
به شما امکان می دهد از طریق AggregateError.errors
به پیام های قولی که در ایجاد خطا نقش داشته اند دسترسی داشته باشید.
عملگرهای تخصیص منطقی جدید
جاوا اسکریپت دارای اپراتورهای تخصیص ریاضی آشنا مانند +=
است که به عنوان یک نوع راحتی، عملیات و تکلیف را یکباره انجام میدهند. ECMAScript 2021 پشتیبانی مشابهی را به عملگرهای منطقی ||
، ??
و &&
اضافه می کند.
بیایید به هر یک از این موارد نگاهی بیندازیم.
تکلیف (??=) باطل شود
میتوانید از عملگر انتساب تهی برای آزمایش تهی یا تعریف نشده بودن یک متغیر استفاده کنید. اگر متغیر تهی یا تعریف نشده باشد، می توانید سمت راست عبارت را به متغیر اختصاص دهید. فهرست ۵ یک مثال است.
let quote = "When goodness is lost there is morality.";
let existingQuote = "A leader is best when people barely know he exists";
let nonExistingQuote = null;
existingQuote ??= quote;
nonExistingQuote ??= quote;
console.log(existingQuote); // A leader is best when people barely know he exists
console.log(nonExistingQuote); // When goodness is lost there is morality.
توجه داشته باشید که وقتی روی متغیری که وجود دارد، مانند existingQuote
استفاده می شود، عملگر انتساب تهی هیچ کاری انجام نمی دهد. با این حال، هنگامی که در nonExistingQuote
استفاده می شود، یک مقدار جدید به نقل قول اختصاص می دهد.
حتی اگر رشته برای existingQuote
(که یک مقدار نادرست در جاوا اسکریپت است) خالی بود، انتساب تهی جایگزین آن نخواهد شد. یک رشته خالی باقی خواهد ماند. این ماهیت عملگر است: این عملگر فقط تهی یا تعریف نشده را آزمایش می کند.
و تکلیف (&&=)
عملگر تخصیص and (&&=
) سمت چپ عبارت را آزمایش می کند. اگر سمت چپ صدق باشد، سمت راست عبارت را اختصاص می دهد. اگر نادرست باشد، اپراتور هیچ کاری انجام نمی دهد. فهرست ۶ یک مثال ساده را نشان می دهد.
let emptyString = "";
emptyString &&= "bar";
console.log (emptyString); // “”
let nonEmptyString = "foo";
nonEmptyString &&= "bar";
console.log(nonEmptyString); // “bar”
در فهرست ۶، اولین گزارش کنسول یک رشته خالی را خروجی می دهد. دلیل آن این است که رشته خالی نادرست است، بنابراین عملگر &&=
مقدار جدیدی به آن اختصاص نمی دهد. کنسول دوم “bar
” را خروجی می دهد. این به این دلیل است که nonEmptyString
“foo
” است، که یک مقدار واقعی است.
&&=
نوعی عملگر حاشیهای است، اما زمانی که به آن نیاز دارید مفید است.
یا تکلیف (||=)
عملگر تخصیص یا برعکس عملگر تخصیص و است که اخیراً مشاهده کردید. میتوانیم از همین مثال از فهرست ۶ استفاده کنیم، این بار &&=
را با ||=
جایگزین کنیم.
let emptyString = "";
emptyString ||= "bar";
console.log (emptyString); // “bar”
let nonEmptyString = "foo";
nonEmptyString ||= "bar";
console.log(nonEmptyString); // “foo”
اگر سمت چپ عبارت نادرست باشد، عملگر تخصیص ||=
در سمت راست قرار می گیرد. بنابراین، در این مورد، emptyString
به “bar
تبدیل می شود”. متغیر nonEmptyString
با مقدار درستی خود “foo
” باقی می ماند.
WeakRef
WeakRef برای ارجاع به یک شی هدف بدون حفظ استفاده می شود آن را از جمع آوری زباله این یک ویژگی زبان نسبتاً باطنی است که توسط کدنویس کار زیاد استفاده نمی شود. یک مورد استفاده رایج برای WeakRef
در پیاده سازی حافظه پنهان یا نگاشت برای اشیاء بزرگ است، “جایی که مایل است یک شی بزرگ تنها به این دلیل که در حافظه پنهان یا نقشه برداری ظاهر می شود زنده نگه نداشته شود.”
بنابراین، اگر متوجه میشوید که یک راهحل ذخیرهسازی برای موجودیتهای بزرگ ایجاد میکنید، به یاد داشته باشید که WeakRef
وجود دارد. در غیر این صورت، اگر در مورد نیاز به مرجع متغیر WeakRef
مطمئن نیستید، احتمالاً باید از استفاده از آن اجتناب کنید. (خود این مشخصات اجتناب از آن را توصیه می کند.)
FinalizationRegistry
این که جاوا اسکریپت FinalizationRegistry
را تقریباً همزمان با منسوخ شدن Object.finalize() در جاوا معرفی کرد کمی طنز برنامه نویسی است. ویژگی ها عملا مشابه هستند. مانند WeakRef
، مشخصات به توسعهدهندگان هشدار میدهد از نهایی کننده های تعریف شده توسط کاربر.
اما برای برخی موارد استفاده، FinalizationRegistry
جدید می تواند همان چیزی باشد که شما نیاز دارید. این مشخصات نمونه ای از فرآیندهای طولانی مدت را ارائه می دهد که دسته های فایل زیادی را مصرف می کنند. در چنین حالتی، استفاده از FinalizationRegistry
میتواند اطمینان حاصل کند که هیچ دستهای درز نمیکند.
در کنار WeakRef
، FinalizationRegistry
به جای توسعهدهندگان برنامه، در جعبه ابزار توسعهدهندگان پلتفرم و چارچوب بهتر جا میگیرد.
جداکننده های لفظی عددی
جداکنندههای عددی زیبایی هستند که دیدن اعداد بزرگ را برای چشمها آسانتر میکنند. جاوا اسکریپت نمیتواند مانند زبانهای طبیعی از کاما استفاده کند، زیرا آن نماد از قبل گرفته شده. بنابراین، ECMAScript 2021 زیر خط را معرفی کرد.
به جای تایپ کردن
let distanceToSun = 91772000000;
می توانید تایپ کنید
let distanceToSun = 91_772_000_000;
خواندن فرم جدید کمی ساده تر است.
بهبودهای Array.prototype.sort
این بیشتر یک یادداشت است تا یک ویژگی. اساساً، مشخصات ECMAScript 2021 در توضیح نحوه عملکرد Array.prototype.sort
دقیق تر است. این تغییر باید تغییرات در پیاده سازی بین موتورها را کاهش دهد.
پست های مرتبط
۸ ویژگی جدید زبان جاوا اسکریپت در ES12
۸ ویژگی جدید زبان جاوا اسکریپت در ES12
۸ ویژگی جدید زبان جاوا اسکریپت در ES12