درس ۱۲: متغیرها و انواع داده

یادگیری متغیرها و انواع داده در JavaScript

پیشرفت درس ۱۲ از ۲۰ درس

متغیرها چیستند؟

متغیرها در JavaScript مانند ظرف‌هایی هستند که می‌توانند انواع مختلف داده را در خود نگهداری کنند. آن‌ها به ما امکان ذخیره، دسترسی و تغییر اطلاعات را می‌دهند.

تشبیه ساده:

متغیر مانند یک جعبه است که:

  • نام دارد: برای شناسایی آن
  • محتوا دارد: داده‌ای که در آن ذخیره شده
  • قابل تغییر است: می‌توان محتوای آن را عوض کرد
  • نوع دارد: نوع داده‌ای که نگهداری می‌کند

تعریف متغیر در JavaScript

در JavaScript سه روش برای تعریف متغیر وجود دارد:

۱. var (روش قدیمی):

var name = 'علی';
var age = 25;

۲. let (روش مدرن):

let name = 'علی';
let age = 25;

۳. const (ثابت):

const PI = 3.14159;
const siteName = 'وب‌سایت من';

تفاوت‌های مهم:

ویژگی var let const
قابل تغییر
محدوده بلوک
تعریف مجدد
مقداردهی اولیه اختیاری اختیاری اجباری

قوانین نام‌گذاری متغیرها

برای نام‌گذاری متغیرها در JavaScript قوانین خاصی وجود دارد:

قوانین اجباری:

  • باید با حرف، _ یا $ شروع شود
  • نمی‌تواند با عدد شروع شود
  • فقط حروف، اعداد، _ و $ مجاز است
  • نمی‌تواند کلمه کلیدی باشد
  • حساس به حروف کوچک و بزرگ است

مثال‌های صحیح:

let userName = 'علی';
let user_name = 'علی';
let $price = 1000;
let _id = 123;
let firstName = 'محمد';
let age25 = 25;

مثال‌های نادرست:

let 2name = 'علی';      // شروع با عدد
let user-name = 'علی';  // استفاده از -
let class = 'A';        // کلمه کلیدی
let user name = 'علی';  // فاصله

بهترین شیوه‌ها:

  • camelCase: firstName, lastName
  • نام‌های معنادار: age به جای a
  • ثابت‌ها با حروف بزرگ: MAX_SIZE
  • متغیرهای بولی: isActive, hasPermission

تمرین عملی: متغیرها و انواع داده

در ادامه، با انواع مختلف متغیرها و داده‌ها آزمایش کنید:

انواع داده در JavaScript

JavaScript دارای انواع مختلف داده است که به دو دسته کلی تقسیم می‌شوند:

۱. انواع ابتدایی (Primitive Types):

Number (عدد):

let age = 25;           // عدد صحیح
let price = 99.99;      // عدد اعشاری
let negative = -10;     // عدد منفی
let infinity = Infinity; // بی‌نهایت
let notANumber = NaN;   // Not a Number

String (رشته):

let name = 'علی';              // تک کوتیشن
let message = "سلام دنیا";      // دابل کوتیشن
let template = \`سلام \${name}\`; // Template literal

Boolean (بولی):

let isActive = true;
let isComplete = false;
let hasPermission = true;

undefined:

let x;                  // undefined
let y = undefined;      // صراحتاً undefined

null:

let data = null;        // مقدار خالی

Symbol (ES6):

let sym = Symbol('id'); // شناسه یکتا

BigInt (ES2020):

let bigNumber = 123456789012345678901234567890n;

انواع داده پیچیده (Reference Types)

Object (شی):

let person = {
  name: 'علی',
  age: 25,
  city: 'تهران'
};

// دسترسی به ویژگی‌ها
console.log(person.name);    // علی
console.log(person['age']);  // 25

Array (آرایه):

let numbers = [1, 2, 3, 4, 5];
let fruits = ['سیب', 'موز', 'پرتقال'];
let mixed = [1, 'سلام', true, null];

// دسترسی به عناصر
console.log(numbers[0]);     // 1
console.log(fruits[1]);      // موز

Function (تابع):

function greet(name) {
  return 'سلام ' + name;
}

let sayHello = function(name) {
  return 'درود ' + name;
};

// Arrow function
let welcome = (name) => \`خوش آمدید \${name}\`;

Date (تاریخ):

let now = new Date();
let birthday = new Date('1995-05-15');
let timestamp = Date.now();

تشخیص نوع داده

برای تشخیص نوع داده از عملگر typeof استفاده می‌کنیم:

console.log(typeof 42);          // "number"
console.log(typeof 'سلام');      // "string"
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"

روش‌های دقیق‌تر:

// برای آرایه‌ها
Array.isArray([1, 2, 3]);       // true

// برای null
value === null;                  // true

// برای NaN
Number.isNaN(NaN);              // true

// برای اشیاء
Object.prototype.toString.call(value);

تبدیل انواع داده

JavaScript قابلیت تبدیل خودکار و دستی انواع داده را دارد:

تبدیل خودکار (Type Coercion):

let result1 = '5' + 3;      // "53" (string)
let result2 = '5' - 3;      // 2 (number)
let result3 = '5' * 3;      // 15 (number)
let result4 = true + 1;     // 2 (number)

تبدیل دستی:

به عدد:

Number('123');        // 123
parseInt('123px');    // 123
parseFloat('12.34');  // 12.34
+'123';              // 123 (روش کوتاه)

به رشته:

String(123);         // "123"
(123).toString();    // "123"
123 + '';           // "123" (روش کوتاه)

به بولی:

Boolean(1);          // true
Boolean(0);          // false
Boolean('');         // false
Boolean('سلام');     // true
!!'سلام';           // true (روش کوتاه)

مقادیر Falsy و Truthy

در JavaScript برخی مقادیر به false و برخی به true تبدیل می‌شوند:

مقادیر Falsy (معادل false):

  • false
  • 0
  • -0
  • 0n (BigInt)
  • "" (رشته خالی)
  • null
  • undefined
  • NaN

مقادیر Truthy (معادل true):

همه مقادیر دیگر، از جمله:

  • true
  • اعداد غیر صفر
  • رشته‌های غیر خالی
  • اشیاء و آرایه‌ها (حتی خالی)
  • توابع

مثال عملی:

if ('') {
  console.log('اجرا نمی‌شود'); // falsy
}

if ('سلام') {
  console.log('اجرا می‌شود'); // truthy
}

if ([]) {
  console.log('اجرا می‌شود'); // آرایه خالی truthy است
}

محدوده متغیرها (Scope)

محدوده تعیین می‌کند که متغیر در کجا قابل دسترسی است:

محدوده سراسری (Global Scope):

var globalVar = 'سراسری';
let globalLet = 'سراسری';

function test() {
  console.log(globalVar); // قابل دسترسی
  console.log(globalLet); // قابل دسترسی
}

محدوده تابع (Function Scope):

function myFunction() {
  var functionVar = 'محلی تابع';
  let functionLet = 'محلی تابع';
  
  console.log(functionVar); // قابل دسترسی
  console.log(functionLet); // قابل دسترسی
}

// console.log(functionVar); // خطا!

محدوده بلوک (Block Scope):

if (true) {
  var blockVar = 'var در بلوک';
  let blockLet = 'let در بلوک';
  const blockConst = 'const در بلوک';
}

console.log(blockVar);   // قابل دسترسی (var)
// console.log(blockLet);   // خطا! (let)
// console.log(blockConst); // خطا! (const)

تمرین‌های عملی

برای تسلط بیشتر بر مطالب این درس، تمرین‌های زیر را انجام دهید:

تمرین ۱: تعریف متغیرها

متغیرهایی برای نگهداری اطلاعات شخصی (نام، سن، شهر) تعریف کنید.

تمرین ۲: تشخیص نوع داده

مقادیر مختلف ایجاد کرده و نوع آن‌ها را با typeof بررسی کنید.

تمرین ۳: تبدیل انواع

رشته‌ای حاوی عدد را به عدد تبدیل کرده و محاسبه انجام دهید.

تمرین ۴: محدوده متغیرها

متغیرهایی در محدوده‌های مختلف تعریف کرده و دسترسی آن‌ها را تست کنید.

نکات مهم و بهترین شیوه‌ها

بهترین شیوه‌ها:

  • از let و const به جای var استفاده کنید
  • const را برای مقادیر ثابت ترجیح دهید
  • نام‌های معنادار برای متغیرها انتخاب کنید
  • متغیرها را در کوچک‌ترین محدوده ممکن تعریف کنید
  • همیشه متغیرها را مقداردهی اولیه کنید

نکات عملکرد:

  • تبدیل نوع خودکار می‌تواند کند باشد
  • از === به جای == استفاده کنید
  • متغیرهای سراسری را محدود کنید
  • از نام‌های کوتاه برای متغیرهای محلی استفاده کنید

اشتباهات رایج:

  • استفاده از var در کد مدرن
  • فراموش کردن تعریف متغیر (ایجاد متغیر سراسری)
  • اشتباه در تبدیل انواع داده
  • استفاده از نام‌های مبهم برای متغیرها
  • عدم درک تفاوت null و undefined

ادامه یادگیری

در درس بعدی با عملگرها و دستورات شرطی در JavaScript آشنا خواهید شد.

درس قبلی: مقدمات JavaScript درس بعدی: عملگرها و شرط‌ها