🧠 خلاصهی مطلب
در دنیای جاوااسکریپت و تایپاسکریپت، هر دو مقدار null و undefined نشاندهنده “عدم وجود داده” هستند، اما منشأ و معنای آنها کاملاً متفاوت است:
undefined: متغیر تعریف شده، اما هنوز هیچ مقداری به آن اختصاص داده نشده است (حالت پیشفرض موتور جاوااسکریپت).
null: یک مقدار خالی که توسط برنامهنویس به صورت عمدی به یک متغیر داده میشود تا بگوید “اینجا عمداً خالی است”.
درک این تفاوت برای جلوگیری از باگهای عجیب و مدیریت درست دادهها (مخصوصاً در ارتباط با APIها) حیاتی است.
🏗️ نوع Undefined چیست؟
وقتی جاوااسکریپت نمیداند مقدار یک چیز چیست، به صورت خودکار به آن undefined میدهد. این اتفاق در حالتهای زیر رخ میدهد:
۱. متغیری تعریف شده ولی مقداردهی نشده است.
۲. تابعی که چیزی return نمیکند.
۳. دسترسی به پراپرتیای از یک آبجکت که وجود ندارد.
javascriptlet name; console.log(name); // خروجی: undefined const user = { age: 25 }; console.log(user.email); // خروجی: undefined
پیام این نوع این است: «من وجود دارم، اما موتور جاوااسکریپت هنوز مقداری برای من پیدا نکرده است.»
🛑 نوع Null چیست؟
مقدار null هرگز به صورت خودکار توسط خود زبان جاوااسکریپت اختصاص داده نمیشود. این شما هستید که به عنوان برنامهنویس تصمیم میگیرید یک متغیر را با null خالی کنید.
javascriptlet activeUser = "Ali"; // کاربر از سیستم خارج میشود activeUser = null;
پیام این نوع این است: «این متغیر قبلاً مقداری داشته یا در آینده خواهد داشت، اما در این لحظه عمداً خالی نگه داشته شده است.»
🔍 تفاوتهای کلیدی: Null در مقابل Undefined
معنا: undefined یعنی “تعریف نشده”، اما null یعنی “خالیِ عمدی”.
عامل ایجاد: undefined معمولاً توسط سیستم/موتور جاوااسکریپت تولید میشود، اما null توسط برنامهنویس نوشته میشود.
باگ تاریخی typeof: اگر از typeof استفاده کنید، typeof undefined برابر undefined است، اما typeof null به اشتباه object برمیگرداند! (این یک باگ قدیمی در جاوااسکریپت است که هرگز اصلاح نشد).
برابری: در بررسی شل (==) این دو با هم برابرند، اما در بررسی سختگیرانه (===) برابر نیستند.
null == undefined 👉 true
null === undefined 👉 false
🔥 ترفند: عملگر Nullish Coalescing (??)
یکی از بهترین راهها برای هندل کردن این دو، استفاده از عملگر ?? است. این عملگر فقط زمانی مقدار جایگزین را برمیگرداند که متغیر شما دقیقاً null یا undefined باشد (برخلاف || که با عدد صفر یا رشته خالی هم تریگر میشود).
javascriptlet userScore = 0; // غلط: استفاده از OR باعث میشه صفر نادیده گرفته بشه // باعث میشه صفر نادیده گرفته بشه OR استفاده از let finalScore1 = userScore || 10; // خروجی: 10 ❌ // درست Nullish Coalescing استفاده از let finalScore2 = userScore ?? 10; // خروجی: 0 ✅
🧠 سخن پایانی
undefined = «سیستم میگوید: من هیچ ایدهای ندارم مقدار این چیست!» 🤷♂️
null = «برنامهنویس میگوید: من این جعبه را عمداً خالی گذاشتم!» 📦
اگر به دنبال این هستید که کدی تمیزتر بنویسید:
👉 هرگز متغیرهای خود را به صورت دستی برابر undefined قرار ندهید؛ اگر میخواهید چیزی را خالی کنید، از null استفاده کنید.
✍️ جملهای برای به خاطر سپردن
undefined یعنی هنوز تکلیفش مشخص نیست؛ null یعنی تکلیفش اینه که خالی باشه!