«هل تحتوي هذه السلسلة على تلك الكلمة؟» — سؤال يقلق كل مبتدئ
\nأنت تكتب سكريبتًا، أو تتلقى ردًا من الخادم، أو ببساطة تقوم بتصفية قائمة المدن. وفجأة تجد نفسك في حيرة: كيف تتحقق مما إذا كانت السلسلة تحتوي على سلسلة فرعية معينة في JavaScript؟ هذا السؤال هو من أكثر الأسئلة شيوعًا على Stack Overflow، حيث يطرحه آلاف المطورين. وليس من دون سبب: السلاسل النصية هي أساس أي تطبيق، والقدرة على البحث بسرعة عن سلاسل فرعية فيها هي مهارة أساسية.
\nفي هذا الدليل التعليمي، سنستعرض ثلاث طرق عملية: من الأكثر حداثة (والأكثر تفضيلاً لدى الجميع) إلى الطريقة الكلاسيكية مع المزايا الإضافية. ستتعرف على متى تستخدم كل طريقة، وستتعلم كتابة كود لا تخجل من عرضه في مقابلة عمل.
\n\nالطريقة رقم 1: includes() — البساطة والأناقة
\nإذا كنت تكتب كودًا بلغة JavaScript الحديثة (ES6 وما فوق)، فإن includes() هو أفضل صديق لك. هذه الطريقة ترجع true أو false وتُقرأ كسؤال إنجليزي عادي: «هل تحتوي السلسلة على السلسلة الفرعية؟».
الصيغة
\nstring.includes(searchString, position)\n- \n
searchString— ما نبحث عنه (إجباري). \n position— معامل اختياري، من أي فهرس نبدأ البحث (الافتراضي 0). \n
مثال عملي
\nconst 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" هما سلسلتان مختلفتان. إذا كنت بحاجة إلى تجاهل حالة الأحرف، فما عليك سوى تحويل كلتا السلسلتين إلى أحرف صغيرة:
const text = "نتعلم JavaScript";\nconst keyword = "javascript";\n\nconsole.log(text.toLowerCase().includes(keyword.toLowerCase())); // true\n\n\nمتى تستخدم
\n- \n
- التحقق من صحة النماذج (التحقق من وجود "@" في البريد الإلكتروني). \n
- البحث في قائمة (تصفية المنتجات). \n
- أي فحص بسيط للاحتواء. \n
الطريقة رقم 2: indexOf() — الكلاسيكية التي لا تموت
\nقبل ظهور includes()، كان الجميع يستخدم indexOf(). إنها لا تقول فقط «نعم/لا»، بل ترجع فهرس أول ظهور للسلسلة الفرعية. إذا لم يتم العثور على السلسلة الفرعية، فستُرجع -1.
الصيغة
\nstring.indexOf(searchValue, fromIndex)\n\nمثال
\nconst 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.
متى تستخدم indexOf() بدلاً من includes()
\n- \n
- عندما تحتاج إلى فهرس بداية السلسلة الفرعية (مثلًا لقص جزء من السلسلة). \n
- العمل مع كود قديم (Internet Explorer والإصدارات القديمة من المتصفحات). \n
- عندما تحتاج إلى العثور على جميع التكرارات (في حلقة مع تغيير
fromIndex). \n
الطريقة رقم 3: search() و RegExp — عندما تحتاج إلى المرونة
\nماذا لو كنت بحاجة إلى العثور ليس فقط على كلمة، بل على نمط؟ على سبيل المثال، «جميع الكلمات التي تبدأ بـ "JS"» أو «رقم هاتف بتنسيق +7-xxx-xxx-xx-xx». هنا تأتي التعبيرات المنتظمة وطريقة search() للإنقاذ.
الصيغة
\nstring.search(regexp)\n
المدونات
توصيات الكتب
اقرأ أيضًا