جلسه ۱۰ - بررسی نوع typeof و instanceof

این دو operator ابزارهای اساسی برای تشخیص نوع داده‌ها در زمان اجرا هستند. درک تفاوت و کاربرد صحیح هر یک برای نوشتن کدهای مستحکم ضروری است.

مفاهیم کلیدی:

۱. عملگر typeof:

  • برای تشخیص نوع اولیه داده‌ها استفاده می‌شود
  • یک رشته برمی‌گرداند که نوع operand را مشخص می‌کند
// مثال‌های typeof
console.log(typeof "Hello");        // "string"
console.log(typeof 42);            // "number"
console.log(typeof true);          // "boolean"
console.log(typeof undefined);     // "undefined"
console.log(typeof null);          // "object" (باگ تاریخی!)
console.log(typeof {});            // "object"
console.log(typeof []);            // "object" (مشکل!)
console.log(typeof function() {}); // "function"
console.log(typeof Symbol());      // "symbol"
console.log(typeof 123n);          // "bigint"

محدودیت‌های typeof:

  • نمی‌تواند بین آرایه و object معمولی تفاوت قائل شود
  • null را به اشتباه “object” گزارش می‌دهد

۲. عملگر instanceof:

  • برای بررسی اینکه آیا یک object نمونه‌ای از یک constructor خاص است
  • زنجیره prototype را بررسی می‌کند
// مثال‌های instanceof
let arr = [1, 2, 3];
console.log(arr instanceof Array);    // true
console.log(arr instanceof Object);   // true (زیرا Array از Object ارث‌بری می‌کند)
 
let date = new Date();
console.log(date instanceof Date);    // true
console.log(date instanceof Object);  // true
 
function Person(name) {
    this.name = name;
}
let john = new Person("John");
console.log(john instanceof Person);  // true
console.log(john instanceof Object);  // true

۳. Array.isArray() - راه حل بهتر برای تشخیص آرایه:

let arr = [1, 2, 3];
let obj = {};
 
console.log(typeof arr);          // "object" (مفید نیست)
console.log(arr instanceof Array); // true (اما مشکلاتی دارد)
console.log(Array.isArray(arr));   // true (بهترین روش)
console.log(Array.isArray(obj));   // false

۴. مقایسه typeof و instanceof:

ویژگیtypeofinstanceof
کاربردنوع اولیهرابطه inheritance
بازگشتstringboolean
کاراییprimitiveها و objectهافقط objectها
زنجیره prototypeبررسی نمی‌کندبررسی می‌کند

۵. بهترین روش‌ها:

// تشخیص دقیق null
let value = null;
console.log(value === null); // true
 
// تشخیص آرایه
let data = [1, 2, 3];
console.log(Array.isArray(data)); // true
 
// تشخیص عدد
let num = 42;
console.log(typeof num === "number" && !isNaN(num)); // true
 
// تابع چندمنظوره برای بررسی نوع
function getType(value) {
    if (value === null) return "null";
    if (Array.isArray(value)) return "array";
    return typeof value;
}

ارزیابی بخش ۸:

سؤال ۱: پیش‌بینی خروجی خروجی هر خط از کد زیر چیست؟

let str = "Hello";
let num = 42;
let bool = true;
let arr = [1, 2, 3];
let obj = { key: "value" };
let n = null;
let u = undefined;
 
console.log(typeof str);
console.log(typeof num);
console.log(typeof bool);
console.log(typeof arr);
console.log(typeof obj);
console.log(typeof n);
console.log(typeof u);

سؤال ۲: تحلیل instanceof خروجی هر عبارت زیر چیست؟

let myArray = [1, 2, 3];
let myDate = new Date();
 
console.log(myArray instanceof Array);
console.log(myArray instanceof Object);
console.log(myDate instanceof Date);
console.log(myDate instanceof Array);
console.log("hello" instanceof String);

سؤال ۳: نوشتن تابع بررسی نوع تابعی بنویسید که یک مقدار دریافت کند و نوع دقیق آن را برگرداند (شامل “null” و “array”)

پاسخ‌های شما:

  1. خروجی کد: string, number, boolean, object, object, object, undefined
  2. instanceof: true, true, true, false, false
  3. تابع: function typeofX(a) { if(a===null) return "null"; else if( Array.isArray(a) ) return "Array"; else return typeof(a); }

بازخورد و تحلیل پاسخ‌های شما:

سؤال ۱: پیش‌بینی خروجی (کاملاً صحیح ✅)

let str = "Hello";
let num = 42;
let bool = true;
let arr = [1, 2, 3];
let obj = { key: "value" };
let n = null;
let u = undefined;
 
console.log(typeof str);    // ✅ "string" (صحیح)
console.log(typeof num);    // ✅ "number" (صحیح)
console.log(typeof bool);   // ✅ "boolean" (صحیح)
console.log(typeof arr);    // ✅ "object" (صحیح - محدودیت typeof)
console.log(typeof obj);    // ✅ "object" (صحیح)
console.log(typeof n);      // ✅ "object" (صحیح - باگ تاریخی)
console.log(typeof u);      // ✅ "undefined" (صحیح)

پاسخ‌های شما کاملاً درست است! شما محدودیت‌های عملگر typeof را به خوبی درک کرده‌اید.


سؤال ۲: تحلیل instanceof (کاملاً صحیح ✅)

let myArray = [1, 2, 3];
let myDate = new Date();
 
console.log(myArray instanceof Array);   // ✅ true (صحیح)
console.log(myArray instanceof Object);  // ✅ true (صحیح - ارث‌بری)
console.log(myDate instanceof Date);     // ✅ true (صحیح)
console.log(myDate instanceof Array);    // ✅ false (صحیح)
console.log("hello" instanceof String);  // ✅ false (صحیح - primitive است نه object)

پاسخ‌های شما کاملاً دقیق است! شما به خوبی متوجه شده‌اید که:

  • instanceof زنجیره prototype را بررسی می‌کند
  • برای primitiveها کار نمی‌کند
  • رابطه inheritance بین Object و سایر built-in objects را تشخیص می‌دهد

سؤال ۳: نوشتن تابع بررسی نوع (کاملاً صحیح ✅)

function typeofX(a) {
    if(a === null) return "null";
    else if(Array.isArray(a)) return "Array";
    else return typeof(a);
}
 
// تست تابع
console.log(typeofX("hello"));    // "string"
console.log(typeofX(42));         // "number" 
console.log(typeofX(null));       // "null"
console.log(typeofX([1, 2, 3]));  // "Array"
console.log(typeofX({}));         // "object"
console.log(typeofX(undefined));  // "undefined"

تابع شما کاملاً درست و بهینه نوشته شده است! این دقیقاً همان رویکردی است که توسعه‌دهندگان حرفه‌ای برای حل محدودیت‌های typeof استفاده می‌کنند.


جمع‌بندی نهایی بخش ۸ و پایان دوره:

شما مفاهیم مهم بررسی نوع داده را به طور کامل فرا گرفته‌اید:

  • ✅ درک کامل عملگر typeof و محدودیت‌های آن
  • ✅ تسلط بر عملگر instanceof و کاربرد آن
  • ✅ آگاهی از Array.isArray() برای تشخیص دقیق آرایه
  • ✅ توانایی نوشتن توابع پیشرفته برای بررسی نوع

🎓 پایان دوره آموزشی متغیرها و انواع داده در جاوااسکریپت

تبریک می‌گویم! شما با موفقیت تمامی مفاهیم اساسی فصل ۳ را به پایان رساندید:

  1. ✅ اعلان و مقداردهی متغیرها (var, let, const)
  2. ✅ انواع داده اولیه در مقابل ارجاعی
  3. ✅ تبدیل نوع و اجبار نوع
  4. ✅ کار با رشته‌ها و متدهای آن
  5. ✅ اعداد و شیء Math
  6. ✅ منطق بولین و مقادیر Truthy/Falsy
  7. ✅ کار با undefined و null
  8. ✅ بررسی نوع با typeof و instanceof

مهارت‌هایی که اکنون کسب کرده‌اید:

  • توانایی انتخاب هوشمندانه بین const، let و var
  • درک عمیق تفاوت رفتار انواع داده اولیه و ارجاعی
  • توانایی مدیریت و پیش‌بینی type coercion
  • تسلط بر متدهای کاربردی رشته و عدد
  • درک کامل مفاهیم truthy/falsy و کاربرد عملی آن‌ها
  • توانایی تشخیص و مدیریت دقیق انواع داده