سلام دوستان! توی این قسمتها میخوایم نوعهای دادهای جاوااسکریپت یا Data Type ها رو بررسی کنیم و با انواع نوعهای دادهای آشنا میشیم.
موارد زیر رو توی این قسمت یاد میگیریم:
- نوع دادهای چیه؟
- چه نوعهای دادهای داریم؟
- چطوری نوع یک مقدار رو تشخیص بدیم؟
- مفهوم زبان Dynamically Typed
نوع دادهای چیه؟ 🤔
هر مقداری توی زبانهای برنامهنویسی یک نوع خاصی داره. برای مثال ما میتونیم توی همه زبانهای برنامهنویسی عدد و رشته داشته باشیم. توی این کد:
const message = "Learning JS!";
مقداری که متغیر message داره از نوع رشته هست. بنابراین جاوااسکریپت با این متغیر مثل یک رشته رفتار میکنه. هر مقداری که تعریف میکنیم، یک ویژگی داره به اسم نوع دادهای. وقتی جاوااسکریپت میخواد کدهای ما رو اجرا کنه، نوع دادهای به جاوااسکریپت میگه که هدف ما از تعریف کردن این مقدار چیه و به چه صورت باید با اون رفتار کنه. توی مثال زیر به جاوااسکریپت میگیم که با متغیر x مثل یک عدد رفتار کن:
const x = 10;
بنابراین وقتی این متغیر رو با نوع عددی تعریف کردیم، به جاوااسکریپت گفتیم که با اون مثل یک عدد رفتار کنه تا بتونیم همه عملیاتی که مربوط به اعداد هست (مثل جمع، ضرب و ...) رو در اختیار داشته باشیم.
اگه این متغیر رو از نوع رشته تعریف میکردیم، جاوااسکریپت با اون مثل یک رشته رفتار میکرد:
const x = "10"; alert(x + 10); // 1010
پس هر مقداری توی جاوااسکریپت یک نوع داره. ما توی جاوااسکریپت علاوه بر نوعهای عدد و رشته، نوعهای مختلف دیگهای هم داریم که توی ادامه با اونها آشنا میشیم.
چه نوعهای دادهای توی جاوااسکریپت داریم؟ 🤔
ما توی جاوااسکریپت ۸ نوع دادهای اصلی داریم:
نکته: ما توی این قسمت با این نوعهای دادهای آشنا میشیم. برای مثال میخوایم بدونیم نوع دادهای آبجکت چیه. اما اینکه آبجکت چیه و چه ویژگیهایی داره رو توی قسمتهای بعدی به طور مفصل بررسی میکنیم.
عدد یا Number
اعدادی که توی جاوااسکریپت داریم (چه صحیح و چه اعشاری) از نوع دادهای Number هستن:
const x = 10; const y = 10.5;
هر دو متغیر بالا از نوع دادهای عدد هستن و عملیات ریاضی مثل ضرب و جمع برای اونها امکانپذیر هست. علاوه بر اعدادی که ما خودمون تعریف میکنیم، توی جاوااسکریپت چند نوع عددی مخصوص وجود داره: Infinity و NaN
±Infinity
یا بینهایت. یعنی بزرگتر یا کوچیکتر از هر عدد دیگهای. ما اون رو زمانی میگیریم که مثلاً عدد 1 رو به 0 تقسیم کنیم:
alert(1 / 0); // Infinity alert(-1 / 0); // -Infinity
مقدار Infinity از نوع عدد هست.
NaN
که مخفف Not-a-Number هست، زمانی اون رو میگیریم که محاسبات ریاضی روی مقادیری غیر عددی انجام بدیم:
alert("Hello" / 2); // NaN alert(0 * Infinity); // NaN
رشته یا String
نوع دادهای رشته یا String برای نگهداری و کار با متنها استفاده میشه. مقدارهایی که بین علامتهای " یا ' و ` قرار میگیرن، به عنوان رشته در نظر گرفته میشن:
const message = "I'm learning JS!"; const phone_number = '009891'; const name = `Mario`;
رشته اول با علامت " یا Double-Quotation ساخته شده.
رشته دوم با علامت ' یا Single-Quotation ساخته شده.
رشته سوم با علامت ` یا Backtick ساخته شده.
اینها ۳ روش ساختن رشتهها توی جاوااسکریپت هستن که توی قسمت رشتهها به طور کامل با اونها آشنا میشیم.
بولیَن یا Boolean
به مقدارهای true و false میگیم بولیَن. کاربرد اونها برای پیادهسازی کردن مفهوم درست/غلط بودن و یا بله/خیر بودن یک عبارت یا مقدار هست. ما به متغیرهای زیر مقدارهای true و false دادیم:
let user_logged_in = false; const learning_javascript = true;
اسم متغیر اول رو user_logged_in گذاشتیم و به اون مقدار false دادیم تا این مفهوم رو پیادهسازی کنیم که کاربر لاگین نکرده.
خروجی عملگرهای مقایسهای که توی قسمتهای بعدی با اونها آشنا میشیم یک مقدار بولین هست:
alert(10 > 2); // true alert(5 === "5"); // false
آبجکت
آبجکتها برای نگهداری مجموعهای از اطلاعات استفاده میشن. همه نوعهای دادهای به غیر از آبجکت مثل رشتهها و اعداد، فقط میتونن شامل یک مقدار باشن. اما آبجکت میتونه شامل چند مقدار دیگه باشه:
const person = { name: 'Emily', age: 5, isAdmin: true }
اینجا ما با علامتهای {} یک آبجکت ساختیم به اسم person که شامل ۳ عضو دیگه شده.
نکته: آرایهها هم برای نگهداری مجموعهای از مقادیر استفاده میشن اما توی جاوااسکریپت، آرایهها نوعی آبجکت هستن و نوع دادهای منحصر به فردی ندارن.
توی قسمتهای بعد به طور کامل با آبجکتها و آرایههای جاوااسکریپت آشنا میشیم.
سیمبل یا Symbol
سیمبلها ارتباط زیادی با آبجکتها دارن و کاربرد اونها به اندازه بقیه نوعهای داده نیست. اما چیزی که اینجا میتونیم به اونها اشاره کنیم اینه که هر سیمبل یک مقدار کاملاً یکتا هست و معمولاً برای زمانی استفاده میشه که میخوایم آبجکتی با کلیدهای یکتا (Unique) داشته باشیم:
const sym1 = Symbol('interest'); const sym2 = Symbol('interest'); const person = { [sym1]: "Walking", [sym2]: "Music", } alert(person[sym1]); // Walking alert(person[sym2]); // Music
بیگاینت یا BigInt
بیگاینت یک نوع دادهای جدید مرتبط به اعداد توی جاوااسکریپت هست و زمانی از اون استفاده میکنیم که با عددهای بسیار بزرگ سر و کار داریم. منظور از اعداد بزرگ، اعدادی خارج از محدوده ±9007199254740991 یا ±(2^53 - 1) هست. یک عدد بیگاینت با اضافه کردن حرف n به آخر یک عددِ عادی درست میشه:
const x = 1n;
این همون عدد 1 هست اما از نوع بیگاینت.
یک عدد بیگاینت نمیتونه همراه با یک عدد معمولی توی یک محاسبات عددی حضور داشته باشه که در این صورت خطا میگیریم:
alert(1n + 2); // TypeError: can't convert BigInt to number
عدد 9,007,199,254,740,991 بزرگترین عددی هست که توی جاوااسکریپت میتونیم با خیال راحت با اون محاسبات عددی انجام بدیم. این عدد به صورت زیر قابل دسترس هست:
alert(Number.MAX_SAFE_INTEGER); // 9007199254740991
هر عددی بزرگتر از این ممکنه خروجیای غیر قابل پیشبینی تولید کنه:
const x = Number.MAX_SAFE_INTEGER + 1; const y = Number.MAX_SAFE_INTEGER + 2; alert(x === y); // true
پس اگه با اعدادی بزرگتر این سر و کار داریم، از بیگاینت استفاده میکنیم:
const x = 9007199254740991n; const y = 9007199254740991n + 1n; alert(x === y); // false alert(x + 1n === y); // true
به n توی این کد دقت کنین.
نال یا Null
نال به معنی یک مقدار خالی یا پوچ هست و زمانی از اون استفاده میکنیم که میخوایم یک متغیر رو با مقدار خالی یا پوچ پیادهسازی کنیم:
const user = null;
توی کد بالا ما متغیر user رو با مقدار نال پیادهسازی کردیم تا این مفهوم رو برسونیم که کاربر وجود نداره.
Undefined
این مقدار شباهت زیادی به نال داره و زمانی اون رو میگیریم که دنبال مقداری هستیم که وجود نداره. برای مثال متغیری که بدون مقدار پیادهسازی بشه، مقدار اون undefined در نظر گرفته میشه:
let x; alert(x); // undefined
چطوری نوع یک مقدار رو تشخیص بدیم؟
حالا که با ۸ نوع دادهای اصلی توی جاوااسکریپت آشنا شدیم، میخوایم ببینیم چطوری میتونیم نوع یک مقدار رو تشخیص بدیم. توی جاوااسکریپت ما با استفاده از یک عملگر به اسم typeof میتونیم نوع یک مقدار رو تشخیص بدیم. ما از typeof به صورت زیر استفاده میکنیم:
typeof "Hello"; // string // or typeof(10); // number
خروجی این عملگر یک رشته هست و به ما میگه مقدار مد نظر ما از چه نوعی هست:
typeof "Hello"; // string typeof 1; // number typeof Infinity; // number typeof NaN; // number typeof true; // boolean typeof {}; // object >> typeof []; // object typeof Symbol('a'); // symbol typeof 1n; // bigint >> typeof null; // object! typeof undefined; // undefined
همونطور که توی خط ۱۰ میبینیم، typeof null برابر با آبجکت هست. توی اکثر زبانهای برنامهنویسی که از نوع دادهای Null پشتیبانی میکنن، نوع Null واقعاً null هست که این موضوع توی جاوااسکریپت یک عیب به حساب میاد و چون این موضوع از همون روزهای ابتدایی پیدایش این زبان وجود داشته، برای حفظ سازگاری کدهایی که با جاوااسکریپت نوشته شدن، این موضوع پایدار مونده و برطرف نشده. اما خب برای بررسی نال بودن یک مقدار از روش زیر استفاده میکنیم:
const x = null; alert(<<x === null>>); // true
مفهوم زبان Dynamically Typed
توی بعضی از زبانهای برنامهنویسی وقتی یک متغیر رو با یک نوع خاص تعریف میکنیم، دیگه نمیتونیم توی اون متغیر، مقداری با نوع متفاوت بریزیم. برای مثال این کد رو در نظر بگیرید که به زبان جاوا (≠ جاوااسکریپت) نوشته شده:
String name = "John"; name = 10; // Error: incompatible types: int cannot be converted to String
توی این کد ابتدا باید نوع متغیر رو تعریف کنیم و به اون مقداری متناسب با نوع اون بدیم. متغیر name از نوع رشته هست و اگه به اون مقدار غیر رشتهای بدیم خطا میگیریم. اما چنین موضوعی رو توی جاوااسکریپت نداریم. متغیرها میتونن بدون مشخصکردن نوع پیادهسازی بشن و همچنین توی یک چرخه از برنامه، یک متغیر میتونه مقدارهایی با نوعهای کاملاً متفاوت بگیره:
let message = "Welcome!"; // perfectly ok: message = 10; message = {};
به همین دلیل، جاوااسکریپت رو زبانی Dynamic و Loosely Typed میشناسیم. در مقایسه با جاوا که زبانی Static و Strong Typed هست.
خب دوستان با نوعهای دادهای جاوااسکریپت آشنا شدیم و قدم بزرگی رو برای یادگیری این زبان برداشتیم. توی قسمتهای بعدی هر نوع دادهای رو مفصل بررسی میکنیم. روزتون خوش 😉✌️