دانستن اینکه نوع یک تکه داده چیست، اغلب برای اجرای روان و بدون خطای کد بسیار مهم است.
JavaScript چندین روش برای بررسی نوع یک مقدار یا شیء دارد.
سازوکارهای بررسی نوع در JavaScript میتوانند تا حدودی غیرقابلاتکا باشند.
برای ایمنی نوع بهتر و نوعهای قویتر، احتمالاً بهتر است از TypeScript استفاده کنید؛ زبانی که بر پایهی JavaScript ساخته شده است، اما با نحو نوعدهی یک زبان دارای نوع ایستا.
typeof
عملگر typeof نوع عملوند خود را برمیگرداند.
خروجی یک رشته است که با نام یکی از انواع دادهی اولیه مطابقت دارد، بهجز "null".
همچنین میتواند "function" یا "object" باشد.
typeof undefined;
// => "undefined"
typeof true;
// => "boolean"
typeof 42;
// => "number"
typeof 'Hello, World!';
// => "string"
typeof function () {
return 'Hello, World';
};
// => "function"
typeof [1, 2, 3, 4];
// => "object"
typeof { city: 'Stockholm', country: 'Sweden' };
// => "object"
به [دلایل تاریخی][typeof null is "object"].
instanceof
برای بررسی نوع یک شیء میتوانید از عملگر instanceof استفاده کنید.
این عملگر بسته به اینکه عملوند دوم در زنجیرهی پروتوتایپ عملوند اول گنجانده شده باشد یا نه، به یک boolean ارزیابی میشود.
برای روشن شدن مطلب، instanceof برمیگرداند که آیا عملوند اول نمونهای از عملوند دوم یا یکی از کلاسهای فرزند آن است یا نه.
instanceof فقط روی اشیاء کار میکند.
class Beverage {
// ...
}
// The Coffee class is a child of the Beverage class.
class Coffee extends Beverage {
// ...
}
const java = new Coffee();
java instanceof Coffee;
// => true
java instanceof Beverage;
// => true
کلاس Array متدی به نام Array.isArray() دارد که بررسی میکند آیا آرگومانش یک آرایه است یا نه.
در حالی که instanceof Array با آرایهای که در یک realm متفاوت ساخته شده باشد، مانند یک iframe در یک صفحهی وب، کار نمیکند، Array.isArray() کار میکند.
دلیل این امر آن است که کلاس Array در هر realm سازندهی متفاوتی دارد و هر iframe realm خودش را دارد؛ یعنی تابع موجود در زنجیرهی پروتوتایپ متفاوت خواهد بود و در نتیجه instanceof Array شکست میخورد.
Array.isArray() میتواند این موضوع را نادیده بگیرد و باید هر جا ممکن بود از آن استفاده شود.
همچنین میتواند از مثبتهای کاذب جان سالم به در ببرد، جایی که یک شیء در واقع یک Array نیست و فقط Array را در زنجیرهی پروتوتایپ خود دارد.
({ __proto__: Array.prototype }) instanceof Array
// => true
Array.isArray({ __proto__: Array.prototype })
// => false
in
عملگر in برمیگرداند که آیا عملوند اول ویژگیای از عملوند دوم است یا نه.
این عملگر بررسی نمیکند که آن ویژگی مقدار تعریفشدهای دارد یا نه.
ویژگیای که روی undefined تنظیم شده باشد، همچنان توسط in تشخیص داده میشود.
class Coffee {
constructor() {
this.temperature = 'hot';
this.isDarkMatter = undefined;
}
coolDown() {
this.temperature = 'warm';
}
}
const espresso = new Coffee();
'temperature' in espresso;
// => true
'color' in espresso;
// => false
'isDarkMatter' in espresso;
// => true
in برای ویژگیها و متدهای ارثبریشده true برمیگرداند.
"coolDown" in espresso
// => true
"constructor" in espresso
// => true
برای جلوگیری از این کار، بهجای آن از Object.hasOwn() استفاده کنید
Object.hasOwn()
متد Object.hasOwn() برمیگرداند که آیا شیء مشخصشده صاحب ویژگی دادهشده است یا نه (یعنی ارثبری نشده باشد یا متد نباشد).
class Coffee {
constructor() {
this.temperature = 'hot';
}
coolDown() {
this.temperature = 'warm';
}
}
const cappuccino = new Coffee();
Object.hasOwn(cappucino, 'temperature');
// => true
Object.hasOwn(cappucino, 'constructor');
// => false
Object.hasOwn(cappucino, 'coolDown');
// => false