
این دو 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:
| ویژگی | typeof | instanceof |
|---|---|---|
| کاربرد | نوع اولیه | رابطه inheritance |
| بازگشت | string | boolean |
| کارایی | 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”)
پاسخهای شما:
- خروجی کد:
string, number, boolean, object, object, object, undefined - instanceof:
true, true, true, false, false - تابع:
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()برای تشخیص دقیق آرایه - ✅ توانایی نوشتن توابع پیشرفته برای بررسی نوع
🎓 پایان دوره آموزشی متغیرها و انواع داده در جاوااسکریپت
تبریک میگویم! شما با موفقیت تمامی مفاهیم اساسی فصل ۳ را به پایان رساندید:
- ✅ اعلان و مقداردهی متغیرها (
var,let,const) - ✅ انواع داده اولیه در مقابل ارجاعی
- ✅ تبدیل نوع و اجبار نوع
- ✅ کار با رشتهها و متدهای آن
- ✅ اعداد و شیء Math
- ✅ منطق بولین و مقادیر Truthy/Falsy
- ✅ کار با undefined و null
- ✅ بررسی نوع با typeof و instanceof
مهارتهایی که اکنون کسب کردهاید:
- توانایی انتخاب هوشمندانه بین
const،letوvar - درک عمیق تفاوت رفتار انواع داده اولیه و ارجاعی
- توانایی مدیریت و پیشبینی type coercion
- تسلط بر متدهای کاربردی رشته و عدد
- درک کامل مفاهیم truthy/falsy و کاربرد عملی آنها
- توانایی تشخیص و مدیریت دقیق انواع داده