| النوع | وقت فحص الشرط | ضمان تنفيذ واحد؟ |
|---|---|---|
| while | قبل كل تكرار | لا |
| do...while | بعد كل تكرار | نعم |
حلقة while تُستخدم عندما لا تعرف مسبقاً عدد مرات التكرار بالضبط، بل تريد الاستمرار في التكرار طالما أن شرطاً معيناً لا يزال true. يُفحص الشرط قبل كل تكرار — إذا كان false من البداية، لن تُنفَّذ الحلقة ولو مرة واحدة.
حلقة do...while مشابهة جداً لكن بفارق جوهري: تُنفِّذ كتلة الكود مرة واحدة أولاً، ثم تفحص الشرط بعدها. هذا يضمن تنفيذ الكود على الأقل مرة واحدة حتى لو كان الشرط false من البداية — مفيدة في حالات مثل عرض قائمة وطلب إدخال من المستخدم على الأقل مرة واحدة قبل التحقق من صحة المدخل.
من أشيع أخطاء المبتدئين نسيان تحديث المتغير المستخدم في الشرط داخل جسم الحلقة، مما يُنتج حلقة لا نهائية (Infinite Loop) تُجمّد المتصفح أو تستهلك الذاكرة بالكامل. لذا يجب دائماً التأكد من وجود خطوة تُقرّب الشرط من أن يصبح false في كل تكرار.
تُستخدم while بكثرة في سيناريوهات مثل قراءة بيانات حتى الوصول لنهاية الملف، أو الانتظار حتى تحقق شرط خارجي (مثل انتظار استجابة من خادم في سياقات معينة)، أو معالجة عناصر من قائمة تتغير ديناميكياً أثناء التنفيذ.
| 1 | // while: يفحص الشرط أولاً |
| 2 | let i = 0; |
| 3 | while (i < 5) { |
| 4 | console.log(i); |
| 5 | i++; |
| 6 | } |
| 7 | |
| 8 | // do...while: ينفذ مرة أولاً ثم يفحص |
| 9 | let j = 0; |
| 10 | do { |
| 11 | console.log(j); |
| 12 | j++; |
| 13 | } while (j < 5); |
مثال 1: عداد تنازلي باستخدام while
| 1 | // عداد تنازلي بسيط |
| 2 | let ثواني = 5; |
| 3 | while (ثواني > 0) { |
| 4 | console.log(ثواني); |
| 5 | ثواني--; |
| 6 | } |
| 7 | console.log("انطلق!"); |
مثال 2: do...while لضمان تنفيذ واحد على الأقل
| 1 | // do...while يضمن تنفيذ الكود مرة واحدة على الأقل |
| 2 | let محاولات = 0; |
| 3 | let كلمة_المرور; |
| 4 | do { |
| 5 | محاولات++; |
| 6 | كلمة_المرور = محاولات === 3 ? "صحيحة" : "خاطئة"; |
| 7 | console.log(`المحاولة ${محاولات}: ${كلمة_المرور}`); |
| 8 | } while (كلمة_المرور !== "صحيحة" && محاولات < 5); |