در حال بارگذاری...

null و undefined

مقدارهای بولی را دیدید — بله یا خیرِ روشن. برنامه گاهی باید بگوید «اینجا مقداری نیست.» در JavaScript دو جور خالی رایج داریم: undefined و null. ظاهرشان شبیه هم است، ولی داستان پشت هر کدام فرق دارد. اینجا جداشان می‌کنیم تا بعداً تبدیل نوع و چک‌ها گیج‌تان نکند.

تفاوت null و undefined چیست؟

undefined معمولاً یعنی «هنوز چیزی اینجا نگذاشته‌اند» — متغیری با let تعریف شده و مقدار نگرفته، یا تکه‌ای که غایب است. null یعنی «عمداً خالی»: خودتان (یا یک API) مقدار null را می‌گذارید تا جا را پاک کنید. با typeof چک کنید: typeof undefined می‌شود "undefined"، اما typeof null همان quirk قدیمی "object" است. وقتی با یکی‌شان مقایسه می‌کنید === را ترجیح بدهید. هر دو falsyاند، ولی هیچ‌کدام نوع بولی (true / false) نیستند.

جعبهٔ ابزار مقدار خالی

📊 null در برابر undefined برای شروع

مفهوم نمونه نتیجه / نکته
غایب / هنوز مقدار ندارد let x; بعد x undefined
خالیِ عمدی let box = null خودتان خالی را انتخاب کرده‌اید
typeof برای غایب typeof undefined "undefined"
typeof برای خالی typeof null "object" (quirk — باز هم یعنی خالی)
مقایسهٔ سخت‌گیر box === null وقتی box همان null باشد true
نکتهٔ مقایسهٔ شل null == undefined با == می‌شود true — برای وضوح === بهتر است

undefined — هنوز مقدار نگذاشته‌اید

با let اسم بسازید و چیزی به آن ندهید. مقدار undefined است. هم خودِ مقدار را لاگ کنید هم typeof را تا برچسب "undefined" جا بیفتد.

undefined به‌صورت پیش‌فرض

javascript
let nickname;
console.log(nickname);
console.log(typeof nickname);

null — خالیِ عمدی

وقتی می‌خواهید سیگنال واضح «بدون مقدار» بدهید، null بگذارید. این با فراموش کردنِ مقداردهی فرق دارد.

عمداً null بگذارید

javascript
let selected = null;
console.log(selected);
console.log(typeof selected);

typeof کنار هم

هر دو نتیجه را کنار هم ببینید. یادتان بماند: چاپ "object" برای typeof null quirk است، نه اینکه همین حالا درس کامل آبجکت را شروع کرده باشید.

typeof برای undefined و null

javascript
console.log(typeof undefined);
console.log(typeof null);
let a;
let b = null;
console.log(typeof a);
console.log(typeof b);

برای null و undefined ترجیح بدهید ===

=== هم مقدار را می‌پرسد هم نوع را. وقتی منظورتان «دقیقاً null» یا «دقیقاً undefined» است از آن استفاده کنید. با == ممکن است null و undefined با هم جور شوند — برای تازه‌کار گیج‌کننده است.

چک سخت‌گیر با ===

javascript
let user = null;
let title;
console.log(user === null);
console.log(title === undefined);
console.log(user === undefined);

== شل می‌تواند این دو را قاطی کند

با ==، null و undefined با هم جور می‌شوند. یک‌بار لاگ کنید تا غافلگیری را ببینید — بعد چک واقعی را روی === نگه دارید.

مقایسهٔ شل == بین null و undefined

javascript
console.log(null == undefined);
console.log(null === undefined);

خط اول به‌خاطر شل بودن == برابر true است. خط دوم false است. چک واقعی را با === بنویسید تا منظورتان روشن بماند.

هر دو خالی را روی صفحه نشان دهید

یک اسم شبیه undefined و یکی با null نگه دارید و با textContent برچسب کوتاه بنویسید.

برچسب صفحه برای null و undefined

html
<!DOCTYPE html>
<html>
<head>
<title>null and undefined — labels</title>
</head>
<body>
<p id="out">…</p>
<script>
let title;
let avatar = null;
document.getElementById("out").textContent =
"title=" + title + " | avatar=" + avatar;
</script>
</body>
</html>

پاراگراف هر دو خالی را در یک خط نشان می‌دهد. فقط avatar را به یک رشتهٔ کوتاه عوض کنید، صفحه را تازه کنید و ببینید نیمه‌ٔ راست عوض می‌شود ولی title همان undefined می‌ماند.

خودتان امتحان کنید

  1. let city; بسازید — بدون مقداردهی، city و typeof city را لاگ کنید.
  2. let bag = null; بگذارید — مقدار و typeof bag را لاگ کنید (quirkِ "object" را ببینید).
  3. typeof undefined و typeof null را کنار هم لاگ کنید تا فرق معلوم شود.
  4. با === مقایسه کنید: متغیرِ null را با null و با undefined چک کنید.
  5. یک‌بار null == undefined را لاگ کنید؛ بعد چک‌های واقعی را با === بنویسید.
  6. در دمو HTML مقدار avatar را "pic.png" کنید، تازه کنید و خط جدید را بخوانید.

اشتباه‌های رایج

  • یکی دانستن همیشگی null و undefined — معنی‌شان فرق دارد (عمدی در برابر هنوز مقدار نگرفته)
  • وحشت از typeof null برابر "object" — quirk است؛ باز هم null را خالیِ عمدی بدانید
  • تکیه روی == بین آن‌ها بدون دیدن جور شدنِ شل
  • صدا زدن هر کدام به‌عنوان بولی — خالی‌اند؛ بولی فقط true / false است
  • قاطی کردن رشتهٔ خالی "" با null — "" هنوز رشته است

خلاصه

  • undefined: غایب / هنوز مقدار نگرفته؛ typeof → "undefined"
  • null: خالیِ عمدی که خودتان می‌گذارید؛ typeof → "object" (quirk)
  • برای چک روشن === را ترجیح بدهید؛ هر دو falsyاند ولی بولی نیستند
  • رشتهٔ خالی "" متن است — همان null یا undefined نیست
  • بعدی: تبدیل نوع — عوض کردن عمدی یک جور مقدار به جور دیگر

🧠 دانش خود را بیازمایید

آماده شروع

دانش خود را بیازمایید

خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کرده‌اید

❓
8
سوالات
🎯
70%
برای قبولی
♾️
∞
زمان
🔄
∞
تلاش‌ها

📝 دستورالعمل‌ها

  • هر سوال را با دقت بخوانید
  • بهترین پاسخ را برای هر سوال انتخاب کنید
  • می‌توانید آزمون را هر چند بار که می‌خواهید تکرار کنید
  • پیشرفت شما در بالا نمایش داده می‌شود