مزیت const در مقابل let در TypeScript (یا Javascript)
من در حال مطالعه کتاب TypeScript Deep Dive بودم و دیدم که هم let و هم const محدوده بلوکی دارند که این عالی است. واضح است که یک const نمیتواند تغییر کند (غیرقابل تغییر است). اما چرا ReSharper من را تشویق میکند که تا جایی که میتوانم چندین let را به const تبدیل کنم؟ من فرض میکنم ReSharper فکر میکند استفاده از const نسبت به let باعث افزایش کارایی میشود؟ آیا تفاوت سرعتی بین const و let وجود دارد؟ آیا دلیل دیگری برای استفاده از const وجود دارد؟ مثال زیر را در نظر بگیرید:
for (let i = 0; i < this.InputControl.ParentQuestions.length; i++) {
const id = this.InputControl.ParentQuestions[i].ParentId;
const value = this.InputControl.ParentQuestions[i].ParentRequiredAnswer;
if (!formVals[id]) return false;
if (formVals[id].toLowerCase() != value.toLowerCase()) return false;
}
قبلاً من let id و let value داشتم اما ReSharper از من خواست آنها را به const تغییر دهم، که کار میکند، اما چرا در این مورد بهتر است؟ یا در هر صورت؟
من همچنین این سؤال را در SO پیدا کردم، اما بیشتر دربارهٔ اینکه let و const چه کاری انجام میدهند صحبت میکند، نه اینکه چرا یکی بهتر از دیگری است. گفته شده که تا حد امکان از const استفاده شود، اما این چه مزیتی دارد؟
پاسخ شماره ۱
من با جورجی موافقم که عملکرد دلیل اصلی نیست. یک تحلیلگر کد میتواند به همان اندازه تشخیص دهد که یک متغیر که با let اعلام شده هرگز دوباره اختصاص داده نمیشود و آن را به همان نحوی بهینه کند که اگر با const اعلام شده بود. (حتی، لینترها قوانینی دارند که این را تشخیص میدهند و پیشنهاد میکنند به جای let از const استفاده کنید.)
بله، این به خواننده علامت میدهد که شما قصد اختصاص دادن به متغیر را ندارید. مزیت const نسبت به گذاشتن یک توضیح که همان چیز را میگوید، این است که const به طور عمده یک روش استاندارد برای علامت دادن است. بهعنوان یک استاندارد، این اطلاعات را سریعتر از توضیحات سفارشی منتقل میکند. (همچنین، یک توضیح میتواند اشتباه باشد اما const اجازه نمیدهد که شما اشتباه کنید.) با این حال، من فکر نمیکنم این اصلیترین مزیت باشد.
اصطلاح «اصل کمترین دسترسی» اغلب همراه با const به کار میرود، اما چرا باید به کمترین دسترسی اهمیت بدهم؟ زیرا این به تشخیص زودهنگام اشتباهات برنامهنویسی کمک میکند. کد زیر را در نظر بگیرید:
function findSomethingInDocument(document) {
let tree = getTreeFromDocument(document); // We get some sort of tree structure.
let found;
for (const child of tree.children) {
if (child.someFlag) {
tree = child; // Oops I meant found = child :(
break;
}
}
return found;
}
در این کد، من tree=child را تایپ کردم در حالی که منظورم این بود که found=child را تایپ کنم. بله، باگ میتواند در تست پیدا شود. اما چرا باید منتظر تست باشیم؟ من هرگز قصد نداشتم tree تغییر کند. اگر آن را const علامت میزدم، آنگاه فوراً خطا را میفهمیدم زیرا کامپایلر من را از آن مطلع میکرد. لازم نبود منتظر تست باشم. کد بالا نسبتاً ساده است اما تصور کنید الگوریتمی پیچیدهتر که از متغیرهای بیشتری استفاده میکند.
پاسخ شماره ۲
وقتی شما یک متغیر دارید که میتواند به صورت const اعلام شود، و آن را به این صورت اعلام میکنید، به خواننده اطلاع میدهید که قصد ندارید بعداً آن را به یک مقدار متفاوت تخصیص دهید.
همچنین با اعلام یک متغیر const به این معنی است که از ابتدا فکر کردهاید که برنامهای برای تخصیص مجدد آن ندارید، که به نوبه خود میتواند شما را از خطاها یا باگهای سهوی محافظت کند.
