فحص السلسلة الفرعية في JavaScript: 3 طرق للمبتدئين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

«هل تحتوي هذه السلسلة على تلك الكلمة؟» — سؤال يقلق كل مبتدئ

\n

أنت تكتب سكريبتًا، أو تتلقى ردًا من الخادم، أو ببساطة تقوم بتصفية قائمة المدن. وفجأة تجد نفسك في حيرة: كيف تتحقق مما إذا كانت السلسلة تحتوي على سلسلة فرعية معينة في JavaScript؟ هذا السؤال هو من أكثر الأسئلة شيوعًا على Stack Overflow، حيث يطرحه آلاف المطورين. وليس من دون سبب: السلاسل النصية هي أساس أي تطبيق، والقدرة على البحث بسرعة عن سلاسل فرعية فيها هي مهارة أساسية.

\n

في هذا الدليل التعليمي، سنستعرض ثلاث طرق عملية: من الأكثر حداثة (والأكثر تفضيلاً لدى الجميع) إلى الطريقة الكلاسيكية مع المزايا الإضافية. ستتعرف على متى تستخدم كل طريقة، وستتعلم كتابة كود لا تخجل من عرضه في مقابلة عمل.

\n\n

الطريقة رقم 1: includes() — البساطة والأناقة

\n

إذا كنت تكتب كودًا بلغة JavaScript الحديثة (ES6 وما فوق)، فإن includes() هو أفضل صديق لك. هذه الطريقة ترجع true أو false وتُقرأ كسؤال إنجليزي عادي: «هل تحتوي السلسلة على السلسلة الفرعية؟».

\n\n

الصيغة

\n
string.includes(searchString, position)
\n
    \n
  • searchString — ما نبحث عنه (إجباري).
  • \n
  • position — معامل اختياري، من أي فهرس نبدأ البحث (الافتراضي 0).
  • \n
\n\n

مثال عملي

\n
const message = "مرحبًا بالعالم! JavaScript رائعة.";\n\nconsole.log(message.includes("JavaScript")); // true\nconsole.log(message.includes("Python"));     // false\nconsole.log(message.includes("العالم", 10));    // false (بحث يبدأ من الحرف العاشر)\n
\n

لاحظ: الطريقة حساسة لحالة الأحرف. "javascript" و "JavaScript" هما سلسلتان مختلفتان. إذا كنت بحاجة إلى تجاهل حالة الأحرف، فما عليك سوى تحويل كلتا السلسلتين إلى أحرف صغيرة:

\n
const text = "نتعلم JavaScript";\nconst keyword = "javascript";\n\nconsole.log(text.toLowerCase().includes(keyword.toLowerCase())); // true\n
\n\n

متى تستخدم

\n
    \n
  • التحقق من صحة النماذج (التحقق من وجود "@" في البريد الإلكتروني).
  • \n
  • البحث في قائمة (تصفية المنتجات).
  • \n
  • أي فحص بسيط للاحتواء.
  • \n
\n\n

الطريقة رقم 2: indexOf() — الكلاسيكية التي لا تموت

\n

قبل ظهور includes()، كان الجميع يستخدم indexOf(). إنها لا تقول فقط «نعم/لا»، بل ترجع فهرس أول ظهور للسلسلة الفرعية. إذا لم يتم العثور على السلسلة الفرعية، فستُرجع -1.

\n\n

الصيغة

\n
string.indexOf(searchValue, fromIndex)
\n\n

مثال

\n
const sentence = "أنا أحب JavaScript و Python.";\n\nconsole.log(sentence.indexOf("أحب")); // 2\nconsole.log(sentence.indexOf("Ruby"));  // -1\n\n// التحقق من الاحتواء\nif (sentence.indexOf("JavaScript") !== -1) {\n    console.log("نعم، السلسلة تحتوي على JavaScript!");\n}\n
\n\n

نقطة دقيقة: لماذا !== -1؟

\n

يكتب العديد من المبتدئين if (str.indexOf("word")) — وهذا خطأ. إذا كانت السلسلة الفرعية في البداية (الفهرس 0)، فإن الشرط if (0) يُعتبر false. قارن دائمًا بـ -1.

\n\n

متى تستخدم indexOf() بدلاً من includes()

\n
    \n
  • عندما تحتاج إلى فهرس بداية السلسلة الفرعية (مثلًا لقص جزء من السلسلة).
  • \n
  • العمل مع كود قديم (Internet Explorer والإصدارات القديمة من المتصفحات).
  • \n
  • عندما تحتاج إلى العثور على جميع التكرارات (في حلقة مع تغيير fromIndex).
  • \n
\n\n

الطريقة رقم 3: search() و RegExp — عندما تحتاج إلى المرونة

\n

ماذا لو كنت بحاجة إلى العثور ليس فقط على كلمة، بل على نمط؟ على سبيل المثال، «جميع الكلمات التي تبدأ بـ "JS"» أو «رقم هاتف بتنسيق +7-xxx-xxx-xx-xx». هنا تأتي التعبيرات المنتظمة وطريقة search() للإنقاذ.

\n\n

الصيغة

\n
string.search(regexp)
\n

المدونات

توصيات الكتب