جلسه ۶ - کار با رشته‌ها- متدها و دستکاری

بخش ۴: کار با رشته‌ها: متدها و دستکاری (Working with Strings: Methods and Manipulation)

رشته‌ها از پرکاربردترین انواع داده در جاوااسکریپت هستند. درک متدهای مختلف برای کار با رشته‌ها برای یک توسعه‌دهنده ارشد ضروری است.

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

۱. ویژگی‌های اصلی رشته‌ها:

  • رشته‌ها در جاوااسکریپت غیرقابل تغییر (Immutable) هستند
  • هر عملیاتی که روی رشته انجام می‌شود، یک رشته جدید برمی‌گرداند
  • رشته‌ها می‌توانند با ' '، " " یا ` ` تعریف شوند

۲. متدهای مهم رشته‌ها:

let text = "Hello, JavaScript!";
 
// طول رشته
console.log(text.length); // 18
 
// تبدیل به حروف بزرگ و کوچک
console.log(text.toUpperCase()); // "HELLO, JAVASCRIPT!"
console.log(text.toLowerCase()); // "hello, javascript!"
 
// پیدا کردن موقعیت
console.log(text.indexOf("Java")); // 7
console.log(text.lastIndexOf("a")); // 9
 
// استخراج بخشی از رشته
console.log(text.slice(0, 5)); // "Hello"
console.log(text.substring(7, 17)); // "JavaScript"
 
// جستجو و بررسی
console.log(text.includes("Script")); // true
console.log(text.startsWith("Hello")); // true
console.log(text.endsWith("!")); // true
 
// جایگزینی
console.log(text.replace("JavaScript", "World")); // "Hello, World!"

۳. Template Literals (معرفی شده در ES6):

let name = "آرش";
let age = 30;
 
// رشته‌های چندخطی و interpolation
let message = `سلام، من ${name} هستم.
${age} سال دارم.`;
 
console.log(message);

۴. متدهای تقسیم و الحاق:

// تقسیم رشته به آرایه
let fruits = "apple,banana,orange";
let fruitArray = fruits.split(",");
console.log(fruitArray); // ["apple", "banana", "orange"]
 
// الحاق رشته‌ها
let str1 = "Hello";
let str2 = "World";
console.log(str1.concat(" ", str2)); // "Hello World"

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

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

let sentence = "I love programming in JavaScript";
 
console.log(sentence.length);
console.log(sentence.toUpperCase());
console.log(sentence.indexOf("programming"));
console.log(sentence.slice(7, 18));
console.log(sentence.includes("Python"));
console.log(sentence.replace("JavaScript", "Python"));

سؤال ۲: نوشتن تابع کاربردی تابعی بنویسید که یک رشته دریافت کند و بررسی کند آیا این رشته یک پالیندروم (متن متقارن) است یا نه؟

مثال پالیندروم: “madam”، “level”، “آبا”

سؤال ۳: استفاده از Template Literals با استفاده از Template Literals، متغیرهای زیر را به صورت یک پیام خوشامدگویی ترکیب کنید:

let firstName = "مریم";
let lastName = "رضایی";
let city = "تهران";

بازخورد و تحلیل پاسخ‌های شما:

سؤال ۱: پیش‌بینی خروجی (نیاز به بازبینی 🔍)

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

let sentence = "I love programming in JavaScript";
 
console.log(sentence.length);                    // ❌ 32 (نادرست) - پاسخ صحیح: 31
console.log(sentence.toUpperCase());             // ✅ "I LOVE PROGRAMMING IN JAVASCRIPT" (صحیح)
console.log(sentence.indexOf("programming"));    // ✅ 7 (صحیح)
console.log(sentence.slice(7, 18));              // ❌ "programming" (نادرست) - پاسخ صحیح: "programmin"
console.log(sentence.includes("Python"));        // ✅ false (صحیح)
console.log(sentence.replace("JavaScript", "Python")); // ✅ "I love programming in Python" (صحیح)

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

  • خط ۱: sentence.length → رشته “I love programming in JavaScript” دارای 31 کاراکتر است (با فاصله‌ها)

  • خط ۴: sentence.slice(7, 18)

    • slice(start, end) از ایندکس start تا end-1 را برمی‌گرداند
    • ایندکس 7: حرف “p” در “programming”
    • ایندکس 18: حرف “g” در “programming”
    • بنابراین خروجی: “programmin” (بدون حرف آخر)

سؤال ۲: تابع پالیندروم (نیاز به بهبود 🔍)

ایده کلی درست است اما کد شما مشکلاتی دارد:

// کد بهبود یافته:
function isPalindrome(str) {
    // حذف فاصله‌ها و تبدیل به حروف کوچک برای بررسی بهتر
    let cleanedStr = str.replace(/\s/g, '').toLowerCase();
    let reversedStr = cleanedStr.split('').reverse().join('');
    return cleanedStr === reversedStr;
}
 
// تست تابع
console.log(isPalindrome("madam"));    // true
console.log(isPalindrome("level"));    // true  
console.log(isPalindrome("آبا"));      // true
console.log(isPalindrome("hello"));    // false

مشکلات کد شما:

  • برای رشته‌های با طول فرد (مثل “نان”) محاسبه نیمه‌ها مشکل دارد
  • بهتر است از متد reverse() استفاده کنید
  • در نظر گرفتن فاصله‌ها و حروف بزرگ/کوچک

سؤال ۳: Template Literals (کاملاً صحیح ✅)

let firstName = "مریم";
let lastName = "رضایی";
let city = "تهران";
 
console.log(`خانم/آقای ${firstName} ${lastName} از ${city} خوش آمدید!`);
// ✅ خروجی: "خانم/آقای مریم رضایی از تهران خوش آمدید!"

پاسخ شما کاملاً درست و تمیز است! استفاده از Template Literals خوانایی کد را بسیار بهبود می‌بخشد.


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

شما مفاهیم اصلی کار با رشته‌ها را خوب یاد گرفته‌اید، فقط نیاز به دقت بیشتر در موارد زیر دارید:

  • ایندکس‌گذاری در متدهای slice() و substring()
  • الگوریتم‌های پیچیده‌تر مانند بررسی پالیندروم

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

  • همیشه مستندات متدهای رشته را برای درست کردن پارامترها بررسی کنید
  • برای الگوریتم‌های پیچیده، ابتدا روی کاغذ منطق آن را بنویسید
  • از Template Literals برای خوانایی بیشتر کد استفاده کنید

آیا این توضیحات شفاف بود و آماده حرکت به بخش بعدی هستید؟

بخش بعدی: “اعداد: عملیات پایه و شیء Math” - جایی با عملیات ریاضی پیشرفته در جاوااسکریپت آشنا می‌شویم!