Menu
العربية

حلقات while في JavaScript: شرح while وdo...while

تعرّف على حلقات while وdo...while في JavaScript، ومتى تستخدمها بدل for، وكيف تتفادى الوقوع في الحلقات اللانهائية.

متى نستخدم while بدل for في جافا سكريبت

حلقة for تتألق لما تعرف النطاق من البداية — "نفّذ هذا ١٠ مرات"، "مرّ على كل فهرس في هذا المصفوف". أمّا حلقة while في جافا سكريبت، فهي للحالة الثانية: استمر حتى يتغيّر شيء ما. أنت لا تعرف كم تكرارًا سيلزم، بل تعرف فقط الشرط الذي يجعلك تتوقف.

الصيغة بسيطة جدًا:

index.js
Output
Click Run to see the output here.

جافا سكريبت تقيّم الشرط الموجود بين القوسين. إذا كانت نتيجته صحيحة (truthy)، يُنفَّذ جسم الحلقة. ثم يُعاد فحص الشرط مرة بعد مرة، إلى أن تصبح قيمته خاطئة (falsy). انسَ count++ وستبقى قيمة الشرط ثابتة للأبد — أهلاً بك في حلقة لا نهائية.

الفكرة الذهنية: افحص، نفّذ، كرّر

لكي تكون حلقة while منطقية، لا بدّ من توفّر ثلاثة عناصر:

  1. شيء يعتمد عليه الشرط.
  2. طريقة يُغيّر بها جسم الحلقة هذا الشيء.
  3. أن يصل الشرط في نهاية المطاف إلى قيمة خاطئة.

إذا أسقطت أيًّا من هذه العناصر فأنت في ورطة. والخطأ الكلاسيكي هو نسيان الخطوة الثانية:

let count = 0;

while (count < 5) {
    console.log(count);
    // نسينا زيادة count — حلقة لا نهائية
}

هذا ينفّذ إلى ما لا نهاية حتى توقف العملية يدويًا. والضرر حقيقي لو حدث ذلك على الخادم. اسأل نفسك دائمًا: ما الذي في جسم الحلقة سيجعل الشرط يتحوّل إلى false؟

حالة استخدام واقعية: عدد تكرارات غير معلوم مسبقًا

هنا بالتحديد تتفوّق while على for. تخيّل أنك تسحب عناصر من مصدر ما ولا تعرف عددها إلا بعد أن تفرغه بالكامل:

index.js
Output
Click Run to see the output here.

shift() بتشيل أول عنصر من المصفوفة وبترجعه. الحلقة بتفضل شغالة طول ما في حاجة في الطابور، وبتخرج لوحدها لما يفضى. تقدر طبعًا تكتب نفس الكلام بحلقة for، لكنك هتبقى بتصارع طبيعة المشكلة — حلقة while هنا بتعبّر عن نيّتك بشكل مباشر.

حلقة do...while: نفّذ الأول، واسأل بعدين

حلقة do...while بتقلب الترتيب: بتنفّذ جسم الحلقة الأول، وبعدين بتتحقّق من الشرط. ده بيضمن إن الكود يتنفّذ مرة واحدة على الأقل:

index.js
Output
Click Run to see the output here.

جسم الحلقة ينفّذ مرة واحدة على الأقل، حتى لو كان الشرط خاطئًا من البداية. قارن هذا بحلقة while العادية، حيث يعني الشرط الخاطئ أن الحلقة لن تعمل ولا مرة واحدة.

الاستخدام الشائع: تطلب من المستخدم إدخال قيمة، تتحقق من صحتها، وتعيد السؤال إن كانت غير صالحة. بما أنك تحتاج أن تسأل مرة واحدة على الأقل، تكون do...while هي الخيار الأنسب.

انتبه إلى الفاصلة المنقوطة بعد القوس ) المُغلق — فعلى عكس while وfor، تتطلب do...while وجودها.

الخروج المبكر باستخدام break

تُخرجك break فورًا من أقرب حلقة تحتويها. إنها وسيلتك للتوقّف عندما لا يكون الشرط الطبيعي كافيًا لضبط اللحظة التي تريد التوقف فيها:

index.js
Output
Click Run to see the output here.

بمجرد تنفيذ break، يتوقف كل شيء داخل الحلقة فورًا — لا بقية الجسم، ولا فحص جديد للشرط. أنت خارج الحلقة.

استخدام while (true) مع break

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

index.js
Output
Click Run to see the output here.

مخرجان لا ثالث لهما: النجاح، أو حدّ الأمان. وحدّ الأمان هنا ليس ترفًا. فكتابة while (true) بدون مسار واضح ومضمون يؤدي إلى break هي وصفة جاهزة لحلقة لا نهائية في جافا سكريبت.

continue: القفز إلى التكرار التالي

تعمل continue على الانتقال مباشرةً إلى فحص الشرط من جديد، متجاوزةً ما تبقّى من جسم التكرار الحالي:

index.js
Output
Click Run to see the output here.

ملاحظة مهمة: إذا كان السطر الذي يُحرّك الحلقة للأمام موجوداً بعد continue، فتهانينا، لقد صنعت حلقة لا نهائية. في المثال السابق، وضعنا n++ قبل continue فكنّا بأمان. لو وضعته بعده، لظلّ n عالقاً على رقم زوجي إلى الأبد.

متى نستخدم while بدل for؟

قاعدة عملية بسيطة:

  • العدّ أو المرور على نطاق معروفfor. صيغة for (let i = 0; i < arr.length; i++) تجمع التهيئة والشرط وخطوة الزيادة في سطر واحد.
  • المرور على مجموعة عناصرfor...of. أنظف من إدارة فهرس يدوياً.
  • التكرار حتى تتغيّر حالة معيّنةwhile. كمعالجة طابور مهام، أو الاستعلام المتكرر (polling)، أو استهلاك stream، أو إعادة المحاولة حتى النجاح.
  • ضمان التنفيذ مرة واحدة على الأقلdo...while.

نظرياً هي متبادلة؛ أي حلقة for يمكن إعادة كتابتها كحلقة while والعكس صحيح. لكن اختيار الصيغة التي تُناسب طبيعة المشكلة يجعل الكود يشرح نفسه بنفسه.

الحلقة اللانهائية في جافا سكريبت: قاعدة واحدة لا غير

كل حلقة while لا بدّ أن يكون لها جواب واضح على السؤال: ما الذي سيوقفها؟

إما أن يصبح الشرط في رأس الحلقة false في لحظة ما، أو أن يوجد break مضمون التنفيذ. إذا لم تستطع الإشارة إلى أحدهما بوضوح، فاعلم أن الحلقة لم تكتمل بعد.

// سيئ: الشرط لا يتغيّر أبدًا
let ready = false;
while (!ready) {
    console.log("جارٍ الانتظار...");
    // لا شيء هنا يغيّر قيمة `ready`
}

// جيد: جسم الحلقة يؤثّر على الشرط
let ready = false;
let checks = 0;
while (!ready) {
    checks++;
    if (checks >= 3) ready = true;
}

في المتصفح، الحلقة اللانهائية بتجمّد التبويب بالكامل. وفي Node، بتستهلك نواة كاملة من المعالج لحد ما توقف العملية يدويًا. يعني من الأفضل تكتشف هالمشاكل قبل ما توصل للإنتاج.

الخطوة التالية: for...of و for...in

حلقة while مثالية لحالة "كرّر لحد ما يتغيّر شي". أما لما تبغى تمر على عناصر مصفوفة أو حروف نص أو خصائص كائن وحدة وحدة، فجافا سكريبت عندها شكلين تانيين من الحلقات مصمَّمين تحديدًا لهذا الغرض — for...of و for...in، وهما موضوع الدرس الجاي.

الأسئلة الشائعة

ما هي حلقة while في جافا سكريبت؟

حلقة while تُنفّذ الكود الموجود بداخلها طالما أن الشرط محقّق (truthy). تقوم جافا سكريبت أولاً بفحص الشرط، ثم تُشغّل الكتلة البرمجية، ثم تفحصه من جديد. وإذا كان الشرط غير محقّق من البداية، فلن يُنفَّذ جسم الحلقة ولو مرة واحدة.

ما الفرق بين while وdo...while؟

حلقة while تفحص الشرط قبل تنفيذ الجسم، أي من الممكن ألا تُنفَّذ إطلاقاً. أما do...while فتُنفّذ الجسم أولاً ثم تفحص الشرط، وبالتالي تعمل مرة واحدة على الأقل بشكل مضمون. استخدم do...while عندما يلزم تنفيذ التكرار الأول دون شروط، كطلب إدخال من المستخدم مثلاً.

كيف أخرج من حلقة while في جافا سكريبت؟

استخدم break للخروج فوراً من الحلقة، أو continue للقفز إلى التكرار التالي مباشرة. وبهذه الطريقة يمكنك استخدام while (true) بأمان: تدور الحلقة إلى ما لا نهاية، ثم تُنهيها بـ break عند تحقّق شرط معيّن داخل الجسم.

تعلّم البرمجة مع Coddy

ابدأ الآن