جاوااسکریپت شامل ۹ نوع از مقادیر هست که ۷ مورد آن از در دستهی Primitive و یا اولیه و ۲ مورد دیگر در دستهی Object و Function قرار دارند.
انواع مقادیر
- Primitive
- Objects and Functions
مقادیر اولیه یا Primitive
فرق اساسی انواع مقادیر دستهی Primitive با دستهی Objects and Functions در این است که آنها غیر قابل تغییر هستن در صورتی که مقادیر موجود در دستهی Objects and Functions قابل ویرایش هستند.
سعی کنید خروجی مثال زیر را حدس بزنید:
let lastName = 'abc';
lastName[0] = 'i';
console.log(lastName);
خروجی این متد یا نمایش "abc" خواهد بود یا یک پیغام خطا که به فعال بودن strict mode بستگی دارد ولی هرگز "ibc" نمایش داده نخواهد شد به این دلیل که "abc" یک نوع مقدار غیر قابل ویرایش است.
تناقض؟؟
نظر شما در رابطه با مثال زیر چیست؟
let pet = 'Narwhal';
pet = 'The Kraken';
console.log(pet); // "The Kraken"
خب شاید با نگاه اول شاید بگید که خب مقدار "Narwhal" به "The Kraken" در این مثال تغییر پیدا کرد اما در حقیقت با عمل انتصاب صرفا متغیر pet به مقدار جدید و مجزای "The Kraken" اشاره میکند.
نکته: متغیرها برابر با مقادیر نیست و این دو شامل دو مفهوم مجزا هستن. متغیرها صرفا به مقادیر اشاره میکنند.
۱ـ لیست مقادیر اولیه یا Primitive
- Undefined
- تنها شامل مقدار undefined
- برای نشان دادن نداشتن مقدار بصورت غیر عمدی (کنترل نشده)
- Null
- تنها شامل مقدار null
- برای نشان دادن نداشتن مقدار بصورت عمدی (توسط ما کنترل یا مدیریت شده)
- Booleans
- دو مقدار true و false
- برای استفاده در عملیات منطقی
- Numbers
- بازهای از اعداد (-110, 3.14, ... )
- برای استفاده در محاسبات ریاضی
- در کد زیر مثالهایی که موجب تولید مقادیر مختلف نوع number میشود آورده شدهاست.
let scale = 0;
let a = 1 / scale; // Infinity
let b = 0 / scale; // NaN
let c = -a; // -Infinity
let d = 1 / c; // -0
- انواع رشتهها ("asdasd" , "aaa" , ... )
- برای نگهداری نوشتهها
- Symbols
- کاربرد غیرمعمول
- برای پنهانسازی جزئیات پیادهسازی
- BigInts
- کاربرد غیر معمول و جدید
- برای استفاده در عملیات ریاضی که نیاز به مقادیر بزرگ در محاسبات دارد
۲ـ مقادیر غیر اصلی یا همان Functions و Objects
- Objects
- {}, [], new Date() و ...
- برای دستهبندی کردن یک بخشی از دادهها و کدها
- Functions
- برای اشاره به بخشی از کدها
پیدا کردن نوع مقادیر در جاوااسکریپت با استفاده از typeof
متد typeof در جاوااسکریپ یک مقدار به عنوان ورودی دریافت میکند و یک حالت از انواع ۹ حالتی که میتواند داشته باشد را بصورت یک رشته برمیگرداند، مانند مثال زیر.
typeof(4); // "number"
باگ جاوااسکریپت در تعیین نوع مقادیر با استفاده از typeof
به مثال زیر توجه کنید
typeof(null); // "object"
خروجی متد typeof جاوااسکریپ برای null مقدار "object" است درصورتی که null از نوع object نبوده و خودش یک نوع اصلی یا Primitive میباشد. (یک یادداشت از تاریخچه رخ دادن این باگ در جاوااسکریپت) امکان اصلاح این مشکل وجود نداشته به این دلیل که این باگ خیلی قدیمی بوده و رفع اون باعث ایجاد مشکل در وبسایتهای زیادی میشد.
خب حالا نظرتون در رابطه با مثال زیر چیه؟
typeof([]); // "object"
به نظرتون این هم باگ جاوااسکریپت هست و انتظار داشتین نوع arrays را دریافت کنید؟ اما اینطور نیست آرایهها از نوعها اصلی یا primitive نیستن و بنابراین از نوع object هستن و خروجی این کد صحیح است.
در جاوااسکریپت هیچ نوع دیگری وجود ندارد
شاید برای شما سوال پیش بیاید که خب تکلیف انواع دیگه مثل آرایهها چی میشه؟
جاوااسکریپت فقط شامل همین ۹ نوع از مقادیر اصلی است که به شرح آن پرداختیم مابقی آن از مثل آرایه و تاریخ و ... از نوع Object به حساب میآیند.
console.log(typeof([])); // "object"
console.log(typeof(new Date())); // "object"
console.log(typeof(/(hello|goodbye)/)); // "object"