تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

تفاوت null و undefined در جاوااسکریپت


۱۹ تیر ۱۳۹۹

در زبان JavaScript، دو مقدار خاص به نام‌های null و undefined وجود دارند که معمولاً برای نمایش نبود مقدار به کار می‌روند. در نگاه اول ممکن است تفاوت این دو برای بسیاری از توسعه‌دهندگان گیج‌کننده باشد، چون هر دو نشان‌دهنده‌ی “هیچ چیز” هستند. اما در واقع، این دو مفهوم تفاوت‌های اساسی با یکدیگر دارند که درک آن‌ها برای نوشتن کدهای دقیق‌تر و بدون خطا ضروری است. در ادامه با شباهت‌ها و تفاوت‌های null و undefined آشنا می‌شویم.

در ادامه خواهیم خواند:

  • شباهت‌های null و undefined
  • تعریف undefined
  • تعریف null
  • چگونه بررسی کنیم که یک متغیر null یا undefined است؟
  • بررسی نوع با استفاده از typeof
  • جمع بندی
تفاوت null و undefined در جاوااسکریپت

شباهت‌های null و undefined

هر دو مقدار null و undefined جزو مقادیر اولیه (primitive values) در جاوااسکریپت هستند و هر دو برای نمایش نبود یک مقدار واقعی به کار می‌روند. با این حال، معنای آن‌ها دقیقاً یکسان نیست.
undefined معمولاً نشان‌دهنده‌ی حالتی است که متغیر تعریف شده اما هنوز هیچ مقداری به آن اختصاص داده نشده، در حالی که null حالتی است که ما به‌صورت عمدی به یک متغیر مقدار “خالی” داده‌ایم تا نشان دهیم که فعلاً هیچ داده‌ای در آن قرار ندارد.
بنابراین، اگرچه هر دو از نظر ظاهری به نبود مقدار اشاره دارند، اما در عمل، کاربرد و مفهوم‌شان در منطق برنامه متفاوت است.

تعریف undefined

در جاوااسکریپت، وقتی یک متغیر را تعریف می‌کنیم اما هنوز هیچ مقداری به آن اختصاص نمی‌دهیم، مقدار پیش‌فرض آن undefined خواهد بود. این یکی از رفتارهای پیش‌فرض زبان است که نشان می‌دهد متغیر وجود دارد، اما هنوز مقدار مشخصی درون آن قرار نگرفته است.

مثال:

let age;
console.log(age); 
// Output: undefined

در این مثال، متغیر age تعریف شده ولی هیچ مقداردهی اولیه‌ای برای آن صورت نگرفته است. وقتی مقدار آن را چاپ می‌کنیم، خروجی undefined خواهد بود. یعنی جاوااسکریپت متوجه است که این متغیر وجود دارد، اما مقدار مشخصی برای آن ثبت نشده.

با هاست Node.js لیارا، توسعه و استقرار اپلیکیشن‌های خود را با سرعت و سادگی بی‌نظیر تجربه کنید.
✅ استقرار سریع با یک کلیک یا از طریق CLI✅ منابع سخت‌افزاری اختصاصی✅ پشتیبان‌گیری خودکار
خرید و راه‌اندازی هاست Node.js

تفاوت با متغیر تعریف‌نشده

نکته مهم این است که undefined با حالتی که متغیر اصلاً تعریف نشده باشد فرق دارد. اگر تلاش کنید از متغیری استفاده کنید که هیچ‌گاه تعریف نشده، برنامه دچار خطا خواهد شد.

console.log(user);
// ReferenceError: user is not defined

در اینجا، متغیر user حتی ایجاد نشده است، بنابراین جاوااسکریپت نمی‌داند چنین چیزی وجود دارد و خطای is not defined تولید می‌کند. اما وقتی متغیری تعریف شده ولی مقدار ندارد، بدون خطا اجرا می‌شود و فقط مقدار undefined را برمی‌گرداند.

تعریف null

در جاوااسکریپت، زمانی که بخواهیم به‌طور صریح و عمدی مشخص کنیم که یک متغیر در حال حاضر هیچ مقدار معتبری ندارد، از مقدار null استفاده می‌کنیم. به بیان ساده‌تر، null به معنای «فقدانِ هدفمندِ مقدار» است.

let age = null;
console.log(age);
// Output: null

در مثال بالا، ما به صورت آگاهانه مقدار null را به متغیر age اختصاص داده‌ایم. این کار معمولاً زمانی انجام می‌شود که بخواهیم متغیر را مقداردهی اولیه کنیم، اما هنوز داده واقعی برای آن نداریم. با این کار، به وضوح اعلام می‌کنیم که این متغیر فعلاً خالی است، اما بعداً قراره مقدار مشخصی دریافت کند.

تفاوت با undefined

هرچند null و undefined هر دو به نوعی به «نبود مقدار» اشاره دارند، اما تفاوت‌شان در این است که:

  • undefined به‌صورت خودکار توسط جاوااسکریپت به متغیرهایی اختصاص داده می‌شود که تعریف شده‌اند اما مقداردهی نشده‌اند.
  • null به‌صورت دستی و توسط برنامه‌نویس استفاده می‌شود تا به‌طور صریح مشخص شود که متغیر فعلاً مقدار ندارد.

این تمایز در بسیاری از شرایط برنامه‌نویسی مهم است؛ مثلاً هنگام بررسی وضعیت فیلدها در فرم‌ها، یا در پاسخ‌های دریافتی از یک API که ممکن است مقدار خاصی نداشته باشد.

با هاست Next.js، همه‌چیز برای اجرای روان اپلیکیشن‌های شما آماده است از توسعه گرفته تا انتشار.
✅ راه‌اندازی بدون دردسر ✅ سرعت بارگذاری بالا با زیرساخت قدرتمند✅ محیطی پایدار برای پروژه‌های در حال رشد
خرید و راه‌اندازی هاست Next.js

نکته جالب درباره null

با اینکه null یکی از مقادیر اولیه (primitive) در جاوااسکریپت است، اما وقتی با عملگر typeof بررسی می‌شود، نتیجه‌ی آن object خواهد بود.

let age = null;
console.log(typeof age);
// Output: "object"

این رفتار در واقع یک باگ قدیمی در طراحی اولیه جاوااسکریپت است که به دلایل سازگاری (backward compatibility) هنوز در زبان باقی مانده. پس اگر دیدید که typeof null برابر با object است، نگران نباشید؛ این رفتار طبیعی جاوااسکریپت است، نه نشانه‌ای از اشتباه در کدنویسی شما.

چگونه بررسی کنیم که یک متغیر null یا undefined است؟

برای بررسی اینکه یک متغیر مقدار null یا undefined دارد، چند روش مختلف وجود دارد که بسته به نیاز شما می‌توانید یکی از آن‌ها را انتخاب کنید.

1. بررسی دقیق با عملگرهای مقایسه‌ای

اگر بخواهید با دقت مشخص کنید که مقدار یک متغیر دقیقاً null یا دقیقاً undefined است، باید از عملگر مقایسه‌ی سختگیرانه (strict comparison) استفاده کنید.

age === null;      
age === undefined; 

این روش به شما اجازه می‌دهد تفاوت میان null و undefined را به‌طور دقیق تشخیص دهید. مثلاً اگر متغیری مقدار null داشته باشد، شرط age === undefined هرگز برقرار نخواهد بود.

با هاست React لیارا، اپلیکیشن‌های خود را سریع و بدون دغدغه راه‌اندازی کنید و از عملکرد پایدار و امنیت بی‌نظیر بهره‌مند شوید.
✅ نصب آسان با چند کلیک✅ منابع اختصاصی و پرسرعت✅ بکاپ خودکار ✅ سرورهای داخلی با تأخیر کم
خرید و راه‌اندازی هاست React

2. بررسی کلی‌تر با استفاده از شرط‌های عمومی

در بسیاری از موارد، تنها کافی است بدانید که آیا متغیر مقدار “معتبری” دارد یا نه. در چنین حالتی، می‌توانید از شرطی مانند زیر استفاده کنید.

if (!age) {
 
}

در این مثال، از ویژگی truthy/falsy بودن مقادیر در جاوااسکریپت استفاده می‌شود. توجه داشته باشید که این روش نه تنها null و undefined، بلکه مقادیر دیگری مانند 0 یا رشته‌ی خالی '' را هم در بر می‌گیرد. پس اگر فقط به دنبال بررسی نبود مقدار هستید (و نه تمایز دقیق)، این روش ساده و مفید است.

اگر بخواهید فقط دو مقدار null و undefined را با هم بررسی کنید و دیگر مقادیر falsy را نادیده بگیرید، می‌توانید از عملگر سست == استفاده کنید:

if (age == null) {
 
}

در این حالت، جاوااسکریپت با استفاده از تبدیل نوع خودکار، null و undefined را برابر می‌داند، اما هیچ‌یک از دیگر مقادیر falsy را شامل نمی‌شود.

با هاست Vue.js لیارا، اپلیکیشن‌های خود را سریع، ایمن و بدون دردسر راه‌اندازی کنید.
✅ استقرار یک‌کلیک یا از طریق CLI✅ منابع اختصاصی✅ بکاپ خودکار✅ سرورهای داخلی برای بهبود سئو
خرید و راه‌اندازی هاست Vue.js

بررسی نوع با استفاده از typeof

در جاوااسکریپت، یکی از ساده‌ترین راه‌ها برای بررسی نوع یک متغیر، استفاده از عملگر typeof است. این عملگر یک رشته (string) برمی‌گرداند که نوع داده‌ای متغیر را نشان می‌دهد.

بررسی undefined

اگر متغیری را تعریف کنید ولی به آن مقداری ندهید، مقدار آن به‌طور پیش‌فرض undefined خواهد بود، و typeof نیز همین را برمی‌گرداند:

let age;
console.log(typeof age); 
// Output: "undefined"

در اینجا متغیر age فقط تعریف شده و مقداردهی نشده است، پس نوع آن undefined در نظر گرفته می‌شود.

بررسی null

اما زمانی که متغیر را به‌صورت دستی مقدار null بدهید.

let age = null;
console.log(typeof age); 
// Output: "object"

شاید انتظار داشته باشید که typeof age در این حالت مقدار "null" را برگرداند، اما خروجی "object" است. این رفتار یک باگ قدیمی در طراحی اولیه‌ی جاوااسکریپت است که از همان نسخه‌های ابتدایی در زبان باقی مانده و به دلایل سازگاری عقب‌رو (backward compatibility) هرگز اصلاح نشده است.

به همین دلیل، هنگام بررسی نوع null نباید صرفاً به typeof تکیه کنید. اگر نیاز دارید به‌صورت دقیق بررسی کنید که مقدار متغیر null است یا نه، بهتر است از مقایسه مستقیم استفاده کنید.

if (age === null) {
}
با هاست Nuxt.js لیارا، اپلیکیشن‌های Vue خود را با سرعت، امنیت و سادگی بی‌نظیر راه‌اندازی کنید.
✅ استقرار آسان با یک کلیک یا از طریق CLI✅ منابع اختصاصی برای عملکرد بهتر✅ پشتیبان‌گیری خودکار
خرید و راه‌اندازی هاست Nuxt.js

جمع بندی

در نهایت، undefined معمولاً زمانی استفاده می‌شود که متغیری تعریف شده اما هنوز مقدار نگرفته، در حالی که null به‌طور صریح برای نشان دادن “نبود مقدار” به کار می‌رود. هرچند هر دو نوعی “تهی بودن” را نمایش می‌دهند، اما تفاوت در کاربرد و رفتارشان بسیار مهم است. آشنایی با این تفاوت‌ها به شما کمک می‌کند تا از خطاهای منطقی در کدها جلوگیری کرده و برنامه‌هایی خواناتر و قابل‌اعتمادتر بنویسید.

منبع: https://flaviocopes.com/javascript-difference-null-undefined