جلسه ۵ - تبدیل نوع و نوع الزامی Type Conversion و  Coercion

بخش ۳: تبدیل نوع و نوع الزامی (Type Conversion & Coercion)

این بخش به یکی از ویژگی‌های منحصربه‌فرد و گاهی گیج‌کننده جاوااسکریپت می‌پردازد. درک این مفاهیم به شما کمک می‌کند کدهای قابل پیش‌بینی‌تری بنویسید.

مفاهیم کلیدی:

۱. تبدیل نوع صریح (Explicit Type Conversion): این زمانی است که شما به عمد یک نوع داده را به نوع دیگر تبدیل می‌کنید. این کار با استفاده از توابعی مانند String()، Number() و Boolean() انجام می‌شود.

// تبدیل به رشته
let num = 123;
let str = String(num);
console.log(str); // خروجی: "123"
console.log(typeof str); // خروجی: "string"
 
// تبدیل به عدد
let str2 = "456";
let num2 = Number(str2);
console.log(num2); // خروجی: 456
console.log(typeof num2); // خروجی: "number"
 
// تبدیل به بولین
let value = 0;
let bool = Boolean(value);
console.log(bool); // خروجی: false

۲. الزام نوع ضمنی (Implicit Type Coercion): این زمانی است که جاوااسکریپت به طور خودکار انواع داده را تبدیل می‌کند. این معمولاً هنگام استفاده از عملگرهای مختلف اتفاق می‌افتد.

موقعیت‌های رایج:

  • هنگام الحاق رشته (String Concatenation):

    let result = 5 + " apples"; // عدد 5 به رشته تبدیل می‌شود
    console.log(result); // خروجی: "5 apples"
  • در عملیات ریاضی:

    let result = "10" - 2; // رشته "10" به عدد تبدیل می‌شود
    console.log(result); // خروجی: 8
  • در مقایسه‌ها:

    console.log(5 == "5"); // خروجی: true (اجبار نوع اتفاق می‌افتد)
    console.log(5 === "5"); // خروجی: false (بدون اجبار نوع)

مقادیر Falsy (نادرست‌نما): مقادیری که وقتی به بولین تبدیل می‌شوند، false می‌شوند:

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

ارزیابی بخش ۳:

سؤال ۱: پیش‌بینی خروجی خروجی هر خط از کد زیر چیست؟

console.log(Number("123"));
console.log(String(true));
console.log(Boolean(""));
console.log(5 + "2");
console.log("10" - 3);
console.log(5 == "5");
console.log(5 === "5");
console.log(Boolean("Hello"));

سؤال ۲: تشخیص نوع تبدیل برای هر مورد مشخص کنید که آیا تبدیل صریح اتفاق افتاده است یا اجبار ضمنی:

  • الف) let x = String(25);
  • ب) let y = "10" * 2;
  • ج) let z = Boolean(0);
  • د) let w = 15 + "";

تحلیل پاسخ‌ها:

سؤال ۱: پیش‌بینی خروجی

بیایید با دقت بیشتری کد را بررسی کنیم:

console.log(Number("123"));    // ✅ 123 (صحیح)
console.log(String(true));     // ❌ "true" (نادرست) - پاسخ صحیح: "true"
console.log(Boolean(""));      // ✅ false (صحیح)
console.log(5 + "2");         // ❌ 7 (نادرست) - پاسخ صحیح: "52"
console.log("10" - 3);        // ✅ 7 (صحیح)
console.log(5 == "5");        // ✅ true (صحیح)
console.log(5 === "5");       // ✅ false (صحیح)
console.log(Boolean("Hello")); // ✅ true (صحیح)

توضیح خطوط نیازمند بازبینی:

  • خط ۲: String(true) → وقتی true به رشته تبدیل می‌شود، به "true" تبدیل می‌شود، نه "true"

  • خط ۴: 5 + "2" → وقتی یک عدد با یک رشته با عملگر + جمع می‌شود، جاوااسکریپت عدد را به رشته تبدیل می‌کند و الحاق رشته انجام می‌دهد. بنابراین 5 به "5" تبدیل شده و با "2" ترکیب می‌شود → "52"

نکته کلیدی: عملگر + وقتی با رشته‌ها استفاده شود، الحاق رشته انجام می‌دهد. اما سایر عملگرهای ریاضی مانند -، *، / رشته‌ها را به عدد تبدیل می‌کنند.


سؤال ۲: تشخیص نوع تبدیل

  • الف) let x = String(25);تبدیل صریح ✅ (ما عمداً از تابع String() استفاده کرده‌ایم)
  • ب) let y = "10" * 2;اجبار ضمنی ✅ (جاوااسکریپت به طور خودکار رشته “10” را به عدد تبدیل می‌کند)
  • ج) let z = Boolean(0);تبدیل صریح ✅ (ما عمداً از تابع Boolean() استفاده کرده‌ایم)
  • د) let w = 15 + "";اجبار ضمنی ✅ (جاوااسکریپت به طور خودکار عدد 15 را به رشته تبدیل می‌کند)

جمع‌بندی نهایی بخش ۳:

نکات مهم برای توسعه‌دهنده ارشد:

  • همیشه از === به جای == استفاده کنید تا از اجبار نوع ناخواسته جلوگیری شود
  • برای تبدیل‌های عددی، از parseInt() و parseFloat() برای رشته‌هایی که ممکن است حروف داشته باشند استفاده کنید
  • برای الحاق رشته‌ها، از template literals (${}) استفاده کنید که خوانایی بیشتری دارد