سلام دوستان! توی این قسمت‌ها می‌خوایم نوع‌های داده‌ای جاوااسکریپت یا Data Type ها رو بررسی کنیم و با انواع نوع‌های داده‌ای آشنا می‌شیم.

موارد زیر رو توی این قسمت یاد می‌گیریم:

 

نوع داده‌ای چیه؟ 🤔

هر مقداری توی زبان‌های برنامه‌نویسی یک نوع خاصی داره. برای مثال ما می‌تونیم توی همه زبان‌های برنامه‌نویسی عدد و رشته داشته باشیم. توی این کد:

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 هست.

 

خب دوستان با نوع‌های داده‌ای جاوااسکریپت آشنا شدیم و قدم بزرگی رو برای یادگیری این زبان برداشتیم. توی قسمت‌های بعدی هر نوع داده‌ای رو مفصل بررسی می‌کنیم. روزتون خوش 😉✌️

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures

https://javascript.info/types

https://stackoverflow.com/questions/1517582/what-is-the-difference-between-statically-typed-and-dynamically-typed-languages

https://en.wikipedia.org/wiki/Data_type

https://www.w3schools.com/js/js_strings.asp

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER