در این درس میخوانید
فرض کنید میخواهید وضعیت یک دانشجو را در برنامه نگه دارید: نام او متن است، تعداد درسها عدد است و پایاندادن دوره یک پاسخ بله یا خیر میخواهد. متغیر نامی برای دسترسی به یک مقدار است. انتخاب نام روشن، مانند completedLessons، کمک میکند مفهوم داده بدون حدسزدن فهمیده شود. این درس دوم مجموعه است؛ مثالها را در یک Console تازه یا فایل app.js مستقل اجرا کنید.
چه زمانی const و چه زمانی let بنویسیم؟
وقتی قرار نیست مقدار دیگری به یک نام نسبت دهید، const انتخاب مناسبی است. اگر در ادامه مقدار متغیر عوض میشود، از let استفاده کنید. const هنگام تعریف به مقدار اولیه نیاز دارد. منظور از ثابتبودن، ممنوعیت انتساب دوباره به همان نام است، نه تغییرناپذیری تمام دادههای درون یک شیء. در کدهای قدیمی var هم میبینید؛ دامنه و رفتار آن با let و const یکسان نیست. برای مثالهای تازهٔ این مجموعه، از const شروع میکنیم و تنها در صورت نیاز به انتساب دوباره، let مینویسیم.
const courseName = "JavaScript";
let completedLessons = 1;
completedLessons = completedLessons + 1;
console.log(courseName, completedLessons); // JavaScript 2انواع اولیه را از روی مقدار بشناسید
- string: متن، مانند نام یک درس داخل کوتیشن.
- number: عددهای معمولی، مانند 12 یا 2.5.
- boolean: مقدار true یا false.
- undefined: نبود مقدار اختصاصیافته در موقعیتهایی مانند متغیر مقداردهینشده.
- null: مقداری که معمولاً برای نشاندادن نبود عمدی یک نتیجه انتخاب میکنیم.
- bigint: عدد صحیح بزرگ، با نمونهای مانند 9007199254740993n.
- symbol: مقداری یکتا که در کاربردهای پیشرفته به کار میآید.
JavaScript نوع را به مقدار مربوط میکند؛ یک متغیر let میتواند ابتدا عدد و بعد متن بگیرد. این آزادی به معنای مناسببودن چنین کاری در هر برنامه نیست. اگر متغیر تعداد درسها گاهی عدد و گاهی جمله باشد، محاسبه و آزمون سخت میشود. بهتر است قرارداد داده را روشن نگه دارید: تعداد همیشه عدد، نام همیشه متن و وضعیت تکمیل همیشه boolean باشد. آرایهها و شیءهای معمولی در گروه object هستند؛ در درسهای جداگانه با آنها کار میکنیم.
let score;
const selectedLesson = null;
console.log(typeof "JS"); // string
console.log(typeof 18); // number
console.log(typeof true); // boolean
console.log(typeof score); // undefined
console.log(typeof selectedLesson); // object
console.log(Array.isArray([1, 2])); // trueنتیجهٔ typeof null برابر object است؛ این یک رفتار تاریخی زبان است، بنابراین برای تشخیص null از مقایسهٔ مستقیم value === null استفاده کنید. typeof برای بررسی سریع مفید است، اما بهتنهایی تشخیصدهندهٔ همهٔ ساختارهای داده نیست؛ مثلاً نوع آرایه را با Array.isArray بررسی میکنیم. همچنین رشتهٔ «18» با عدد 18 برابر نیست و در محاسبه باید تبدیل مناسب انجام شود؛ موضوع درس بعد همین تفاوت است.
چرا میتوان عضو یک شیء const را تغییر داد؟
const learner = { name: "سارا", completed: 1 };
learner.completed = 2;
console.log(learner.completed); // 2
// learner = {}; // با برداشتن کامنت، انتساب دوباره خطا میدهد.در این مثال، learner همچنان به همان شیء اشاره میکند و فقط ویژگی completed عوض شده است. برای جلوگیری از تغییرهای ناخواسته باید قرارداد دیگری در طراحی برنامه داشته باشید؛ const بهتنهایی شیء را منجمد نمیکند. حتی Object.freeze نیز بهصورت پیشفرض تغییرناپذیری عمیق همهٔ شیءهای تودرتو را ایجاد نمیکند. فعلاً کافی است تفاوت «انتساب نام» و «ویرایش محتوا» را بهدرستی تشخیص دهید.
دامنهٔ بلوک و خطای استفادهٔ زودهنگام
متغیری که با let یا const داخل آکولاد یک بلوک تعریف شده، بیرون همان بلوک در دسترس نیست. همچنین نمیتوانید پیش از اجرای خط تعریف به آن دسترسی بگیرید؛ این بازه را Temporal Dead Zone مینامند. بهجای حفظ تعریف اصطلاح، ترتیب برنامه را بخوانید: اول داده را تعریف کنید و بعد از آن استفاده کنید. نامها به بزرگی حروف حساساند؛ lesson و Lesson دو نام متفاوتاند.
{
const localTitle = "درس دوم";
console.log(localTitle);
}
// console.log(localTitle); // بیرون بلوک: ReferenceError
// console.log(nextLesson); // پیش از تعریف: ReferenceError
let nextLesson = 3;
console.log(nextLesson); // 3تمرین و پاسخ پیشنهادی
یک پروفایل یادگیری بسازید که نام ثابت، امتیاز قابل تغییر و وضعیت پایان دوره داشته باشد. امتیاز را پنج واحد افزایش دهید و نوع هر مقدار را چاپ کنید. ورودی این تمرین عدد ثابت است؛ هنوز سراغ فرم و ورودی کاربر نرفتهایم. اگر برنامهٔ شما مقدار نهایی 15 و نوعهای string، number و boolean را نشان دهد، بخش اصلی تمرین درست است.
const learnerName = "آرمان";
let points = 10;
const finished = false;
points += 5;
console.log(points); // 15
console.log(typeof learnerName, typeof points, typeof finished);
// string number booleanاشتباههای رایج و معیار یادگیری
نوشتن عدد با کوتیشن، استفاده از نام نامشخصی مانند x برای دادهٔ اصلی، تعریف متغیر بدون let یا const و انتظار تغییرناپذیری کامل از const، چهار اشتباه پرتکرارند. اگر انتساب دوباره لازم شد، همان متغیر را let تعریف کنید؛ تمام متغیرهای پروژه را بیدلیل قابل تغییر نکنید. آمادهٔ ادامه هستید وقتی بتوانید پیش از اجرای مثال، نوع خروجی را حدس بزنید و علت هر خطای کامنتشده را توضیح دهید.
منابع انگلیسی
- MDN — Grammar and types
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types
- MDN — JavaScript data types and data structures
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Data_structures
متن فارسی و مثالها برای این مجموعه تدوین شدهاند؛ منابع بالا برای بررسی تعریفهای زبان و مطالعهٔ بیشتر معرفی شدهاند. درس بعد، تبدیل نوع و عملگرها را با یک محاسبهٔ واقعی تمرین میکند.
پیشنیاز و محیط اجرای مثالها
درس 2 از ۲۰؛ پیشنیاز: درسهای قبلی مجموعه. کدهای مستقل این درس در Console تازهٔ مرورگر یا فایل JavaScript اجرا میشوند؛ نمونهها را جداگانه آزمایش کنید.
پیشرفت روی همین مرورگر ذخیره میشود.