{"id":"l-js-2-1","courseId":"javascript-fundamentals","lang":"ar","kind":"lesson","summary":"تجعل برنامجك يختار بين مسارات مختلفة باستخدام if وelse if وelse، وتجمع الشروط بـ &amp;&amp; و|| و!، وتختار القيم بالعامل الثلاثي، وتتوقّع أيّ القيم تُعدّ truthy وأيّها falsy.","html":"<p>يستطيع Pocket أن يجمع ما أنفقته. والآن عليه أن يخبرك كيف حالك: بخير، أو تقترب من ميزانيتك، أو تجاوزتها. وهذا يعني تنفيذ كود مختلف بحسب البيانات، وهذا ما وُجدت الشروط من أجله.</p>\n<h2 id=\"sec-1\" tabindex=\"-1\">if وelse if وelse</h2>\n<p>تعليمة <code dir=\"ltr\">if</code> تنفّذ كتلة من الكود فقط حين يكون شرطها صحيحًا:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"js\" data-run=\"js\" data-index=\"0\"><div class=\"code-head\"><span class=\"code-title\">JavaScript</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"js\" data-index=\"0\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">const</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> budgetCents</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 2000</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">;</span></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">const</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> spentCents</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 1750</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">if</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> (spentCents </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">></span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> budgetCents) {</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  console.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">log</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Over budget\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">);</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">} </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">else</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> if</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> (spentCents </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">>=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> budgetCents </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">*</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 0.8</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">) {</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  console.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">log</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Close to your budget\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">);</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">} </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">else</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> {</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  console.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">log</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"On track\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">);</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">}</span></span></code></pre><div class=\"run-output\" data-run-output=\"0\" hidden></div></div>\n<p>يحسب المحرّك الشرط الأول، <code dir=\"ltr\">1750 &gt; 2000</code>، فيحصل على <code dir=\"ltr\">false</code>، وينتقل إلى ما بعده. الشرط الثاني، <code dir=\"ltr\">1750 &gt;= 1600</code>، صحيح (<code dir=\"ltr\">true</code>)، فتُنفَّذ كتلته، <strong>ويُتخطّى باقي السلسلة</strong>. أما كتلة <code dir=\"ltr\">else</code> فلا تُنفَّذ إلا حين تكون كل الشروط التي فوقها خاطئة. ولا تُنفَّذ أبدًا أكثر من كتلة واحدة في السلسلة.</p>\n<figure class=\"diagram\"><svg class=\"diagram-svg\" focusable=\"false\" viewBox=\"0 0 640 260\" role=\"img\" aria-labelledby=\"l-js-2-1-t1\"><defs><marker id=\"arrow-l-js-2-1-1\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\"><path d=\"M0 0 L10 5 L0 10 z\" class=\"d-arrowhead\"/></marker></defs>\n  <title id=\"l-js-2-1-t1\">مسار فحص الميزانية: أولًا افحص هل الإنفاق أكبر من الميزانية؛ إن كان كذلك فاطبع Over budget. وإن لم يكن، فافحص هل الإنفاق 80 بالمئة من الميزانية على الأقل؛ إن كان كذلك فاطبع Close. وإن لم يكن، فاطبع On track.</title>\n  <rect class=\"d-box-accent\" x=\"20\" y=\"30\" width=\"200\" height=\"50\" rx=\"10\"/>\n  <text class=\"d-code\" x=\"120\" y=\"60\" text-anchor=\"middle\">spent &gt; budget?</text>\n  <rect class=\"d-box-accent\" x=\"20\" y=\"120\" width=\"200\" height=\"50\" rx=\"10\"/>\n  <text class=\"d-code\" x=\"120\" y=\"150\" text-anchor=\"middle\">spent ≥ 80%?</text>\n  <rect class=\"d-box-success\" x=\"20\" y=\"205\" width=\"200\" height=\"44\" rx=\"10\"/>\n  <text class=\"d-label\" x=\"120\" y=\"232\" text-anchor=\"middle\">\"On track\"</text>\n  <rect class=\"d-box-warn\" x=\"400\" y=\"30\" width=\"200\" height=\"50\" rx=\"10\"/>\n  <text class=\"d-label\" x=\"500\" y=\"60\" text-anchor=\"middle\">\"Over budget\"</text>\n  <rect class=\"d-box-warn\" x=\"400\" y=\"120\" width=\"200\" height=\"50\" rx=\"10\"/>\n  <text class=\"d-label\" x=\"500\" y=\"150\" text-anchor=\"middle\">\"Close\"</text>\n  <path class=\"d-arrow\" d=\"M220 55 L396 55\" marker-end=\"url(#arrow-l-js-2-1-1)\"/>\n  <text class=\"d-label-muted\" x=\"308\" y=\"46\" text-anchor=\"middle\">true: توقّف</text>\n  <path class=\"d-arrow\" d=\"M220 145 L396 145\" marker-end=\"url(#arrow-l-js-2-1-1)\"/>\n  <text class=\"d-label-muted\" x=\"308\" y=\"136\" text-anchor=\"middle\">true: توقّف</text>\n  <path class=\"d-arrow\" d=\"M120 80 L120 116\" marker-end=\"url(#arrow-l-js-2-1-1)\"/>\n  <text class=\"d-label-muted\" x=\"160\" y=\"103\">false</text>\n  <path class=\"d-arrow\" d=\"M120 170 L120 201\" marker-end=\"url(#arrow-l-js-2-1-1)\"/>\n  <text class=\"d-label-muted\" x=\"160\" y=\"192\">false</text>\n</svg><figcaption>سلسلة if تتوقّف عند أول شرط صحيح</figcaption></figure>\n<p>لأن أول شرط صحيح هو الذي يفوز، فإن <strong>الترتيب مهم</strong>. ضع الحالة الأضيق أولًا. لو فحصت “80% على الأقل” قبل “تجاوز الميزانية”، فإن الشهر الذي تجاوز الميزانية سيكون أيضًا 80% على الأقل، ولن ترى رسالة “Over budget” أبدًا. وفي الاختبار أدناه سؤال فيه هذا الخطأ بالضبط.</p>\n<p>الأقواس المعقوفة تحدّد <strong>كتلة</strong> (block)، أي مجموعة من التعليمات تُنفَّذ معًا. إن كان جسم الشرط سطرًا واحدًا فالأقواس اختيارية من الناحية التقنية، لكن اكتبها دائمًا: إضافة سطر ثانٍ لاحقًا دون أقواس خطأ كلاسيكي يجعل السطر الأول وحده هو المشروط.</p>\n<h2 id=\"sec-2\" tabindex=\"-1\">الجمع بين الشروط</h2>\n<p>ثلاثة <strong>عوامل منطقية</strong> تتيح لك بناء شروط أكبر:</p>\n<ul>\n<li><code dir=\"ltr\">a &amp;&amp; b</code> (و) صحيحة فقط حين يكون الطرفان صحيحين.</li>\n<li><code dir=\"ltr\">a || b</code> (أو) صحيحة حين يكون أحد الطرفين على الأقل صحيحًا.</li>\n<li><code dir=\"ltr\">!a</code> (ليس) تقلب الصحيح إلى خاطئ والعكس.</li>\n</ul>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"js\" data-run=\"js\" data-index=\"1\"><div class=\"code-head\"><span class=\"code-title\">JavaScript</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"js\" data-index=\"1\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">const</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> amountCents</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 12500</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">;</span></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">const</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> category</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"travel\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">;</span></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">const</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> isWeekend</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> false</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">if</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> (amountCents </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">></span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 10000</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> &#x26;&#x26;</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> category </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">!==</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"rent\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">) {</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  console.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">log</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Big purchase: ask yourself twice\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">);</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">}</span></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">if</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> (category </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">===</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"food\"</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> ||</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> category </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">===</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"travel\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">) {</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  console.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">log</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Flexible spending\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">);</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">}</span></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">if</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> (</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">!</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">isWeekend) {</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  console.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">log</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Weekday\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">);</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">}</span></span></code></pre><div class=\"run-output\" data-run-output=\"1\" hidden></div></div>\n<p>تُحسب <code dir=\"ltr\">&amp;&amp;</code> قبل <code dir=\"ltr\">||</code>، تمامًا كما يُحسب <code dir=\"ltr\">*</code> قبل <code dir=\"ltr\">+</code>. وحين تخلط بينهما، أضف أقواسًا كي لا يضطر أحد، بما في ذلك أنت في المستقبل، إلى تذكّر هذه القاعدة.</p>\n<h2 id=\"sec-3\" tabindex=\"-1\">قيمة واحدة وخيارات ثابتة كثيرة: switch</h2>\n<p>حين تقارن قيمة واحدة بقائمة من الخيارات المحدّدة، مثل الفئة، تصبح سلسلة <code dir=\"ltr\">else if (category === …)</code> مكرّرة ومملّة. وتعليمة <code dir=\"ltr\">switch</code> مصمّمة لهذه الحالة بالذات:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"js\" data-run=\"js\" data-index=\"2\"><div class=\"code-head\"><span class=\"code-title\">JavaScript</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"js\" data-index=\"2\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">const</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> category</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"travel\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">;</span></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">let</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> monthlyLimit;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">switch</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> (category) {</span></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">  case</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"food\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">:</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">    monthlyLimit </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 40000</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">;</span></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">    break</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">;</span></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">  case</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"travel\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">:</span></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">  case</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"fun\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">:</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">    monthlyLimit </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 15000</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">;</span></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">    break</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">;</span></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">  default</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">:</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">    monthlyLimit </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 10000</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">;</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">}</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">console.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">log</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(monthlyLimit);</span></span></code></pre><div class=\"run-output\" data-run-output=\"2\" hidden></div></div>\n<p>تقارن <code dir=\"ltr\">switch</code> باستخدام <code dir=\"ltr\">===</code>، وتقفز إلى أول <code dir=\"ltr\">case</code> مطابقة، وتنفّذ من هناك <strong>حتى تصل إلى <code dir=\"ltr\">break</code></strong>. انسَ <code dir=\"ltr\">break</code> فيستمر التنفيذ “منزلقًا” (fall through) إلى الحالة التالية، وهذا خطأ متكرّر. وأحيانًا يكون مقصودًا، كما في اشتراك <code dir=\"ltr\">&quot;travel&quot;</code> و<code dir=\"ltr\">&quot;fun&quot;</code> في سقف واحد أعلاه. أما <code dir=\"ltr\">default</code> فتُنفَّذ حين لا يطابق شيء، مثل <code dir=\"ltr\">else</code> الأخيرة. ومع شرطين أو ثلاثة، أو مع أي شيء ليس فحص مساواة بسيطًا، ابقَ مع <code dir=\"ltr\">if</code>.</p>\n<h2 id=\"sec-4\" tabindex=\"-1\">العامل الثلاثي: اختيار قيمة</h2>\n<p>كثيرًا ما لا تريد أن <em>تفعل</em> أشياء مختلفة، بل أن <em>تختار</em> بين قيمتين. و<strong>العامل الشرطي</strong>، الذي يُسمّى عادةً العامل الثلاثي (ternary)، يفعل ذلك في تعبير واحد:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"js\" data-run=\"js\" data-index=\"3\"><div class=\"code-head\"><span class=\"code-title\">JavaScript</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"js\" data-index=\"3\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">const</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> spent</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 2100</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">;</span></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">const</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> budget</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 2000</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">;</span></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">const</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> status</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> spent </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">></span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> budget </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">?</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"Over budget\"</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> :</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"On track\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">;</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">console.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">log</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(status);</span></span></code></pre><div class=\"run-output\" data-run-output=\"3\" hidden></div></div>\n<p>اقرأه هكذا: “إن كان <code dir=\"ltr\">spent &gt; budget</code> فالقيمة <code dir=\"ltr\">&quot;Over budget&quot;</code>، وإلا فالقيمة <code dir=\"ltr\">&quot;On track&quot;</code>”. ولأن العامل الثلاثي يُنتج قيمة، يمكنك تخزينها في <code dir=\"ltr\">const</code> أو إسقاطها داخل template literal. استخدمه حين تكون هناك نتيجتان. ومع ثلاث نتائج أو أكثر، تُقرأ سلسلة <code dir=\"ltr\">if</code> أفضل من العوامل الثلاثية المتداخلة.</p>\n<h2 id=\"sec-5\" tabindex=\"-1\">القيم الـ truthy والـ falsy</h2>\n<p>لا يُشترط أن يكون الشرط قيمة منطقية. تقبل JavaScript أي قيمة وتحوّلها: القيم التي تُعامَل على أنها صحيحة تُسمّى <strong>truthy</strong>، والتي تُعامَل على أنها خاطئة تُسمّى <strong>falsy</strong>. وقائمة الـ falsy قصيرة بما يكفي لتحفظها:</p>\n<p><code dir=\"ltr\">false</code>، <code dir=\"ltr\">0</code>، <code dir=\"ltr\">-0</code>، <code dir=\"ltr\">0n</code>، <code dir=\"ltr\">&quot;&quot;</code> (نص فارغ)، <code dir=\"ltr\">null</code>، <code dir=\"ltr\">undefined</code>، <code dir=\"ltr\">NaN</code>.</p>\n<p>وكل ما عداها truthy، بما في ذلك قيم تفاجئ الناس: <code dir=\"ltr\">&quot;0&quot;</code> و<code dir=\"ltr\">&quot;false&quot;</code> و<code dir=\"ltr\">&quot; &quot;</code> (مسافة)، والقوائم والكائنات الفارغة.</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"js\" data-run=\"js\" data-index=\"4\"><div class=\"code-head\"><span class=\"code-title\">JavaScript</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"js\" data-index=\"4\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">const</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> note</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">;</span></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">if</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> (note) {</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  console.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">log</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Has a note\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">);</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">} </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">else</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> {</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  console.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">log</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"No note\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">);</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">}</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">console.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">log</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">Boolean</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"0\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">), </span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">Boolean</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">0</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">), </span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">Boolean</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\" \"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">));</span></span></code></pre><div class=\"run-output\" data-run-output=\"4\" hidden></div></div>\n<p>هذه الخاصية تجعل فحوصًا مثل <code dir=\"ltr\">if (note)</code> قصيرة ومقروءة مع النصوص، حيث “فارغ” و&quot;غير موجود&quot; يعنيان كلاهما “لا شيء لعرضه”. لكنها خطرة مع الأرقام، حيث يكون الصفر غالبًا قيمة حقيقية وصالحة.</p>\n<aside class=\"callout callout-mistake\" role=\"note\"><p class=\"callout-title\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\"/><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/></svg><span><span class=\"callout-kind\">خطأ شائع</span><span class=\"callout-sep\" aria-hidden=\"true\"> · </span>فحص مبلغ باستخدام if (amount)</span></p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"js\" data-index=\"5\"><div class=\"code-head\"><span class=\"code-title\">JavaScript</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">const</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> amountCents</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 0</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">; </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\">// a free coffee voucher, recorded on purpose</span></span>\n<span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">if</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> (amountCents) {</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  console.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">log</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Recorded\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">);</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">} </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">else</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> {</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  console.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">log</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Please enter an amount\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">); </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\">// runs, wrongly</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">}</span></span></code></pre></div>\n<p>الصفر falsy، فيبدو الصفر المشروع وكأنه “لم يُدخَل شيء”. قل ما تعنيه بالضبط: <code dir=\"ltr\">if (typeof amountCents === &quot;number&quot; &amp;&amp; amountCents &gt;= 0)</code>.</p>\n</aside>\n<p>تعمل <code dir=\"ltr\">&amp;&amp;</code> و<code dir=\"ltr\">||</code> أيضًا مع القيم غير المنطقية: فهما تُرجعان أحد طرفيهما. التعبير <code dir=\"ltr\">name || &quot;Anonymous&quot;</code> يعطي <code dir=\"ltr\">name</code> إن كانت truthy، و<code dir=\"ltr\">&quot;Anonymous&quot;</code> فيما عدا ذلك، وهذه طريقة شائعة لتوفير قيم افتراضية. لكن فيها مشكلة الصفر نفسها، ولهذا أضافت JavaScript عاملًا أفضل للقيم الافتراضية، هو <code dir=\"ltr\">??</code>، وستتعرّف عليه في القسم 3.</p>\n<aside class=\"callout callout-tip\" role=\"note\"><p class=\"callout-title\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5\"/><path d=\"M9 18h6\"/><path d=\"M10 22h4\"/></svg><span><span class=\"callout-kind\">نصيحة</span><span class=\"callout-sep\" aria-hidden=\"true\"> · </span>علامة = واحدة داخل if</span></p>\n<p><code dir=\"ltr\">if (category = &quot;food&quot;)</code> تُسنِد بدلًا من أن تقارن، فيكون الشرط دائمًا النص <code dir=\"ltr\">&quot;food&quot;</code>، وهو truthy. المقارنات تستخدم <code dir=\"ltr\">===</code>. أدوات الفحص مثل ESLint تنبّه إلى هذا؛ فإن وضع محرّرك خطًا تحته فاقرأ التحذير.</p>\n</aside>\n<p>الشروط تتيح لـ Pocket أن يتفاعل مع قيمة واحدة. وفي الدرس التالي ستجعله يتعامل مع قيم كثيرة، واحدة تلو الأخرى، باستخدام حلقات التكرار.</p>\n","toc":[{"id":"sec-1","text":"if وelse if وelse","level":2},{"id":"sec-2","text":"الجمع بين الشروط","level":2},{"id":"sec-3","text":"قيمة واحدة وخيارات ثابتة كثيرة: switch","level":2},{"id":"sec-4","text":"العامل الثلاثي: اختيار قيمة","level":2},{"id":"sec-5","text":"القيم الـ truthy والـ falsy","level":2}],"takeaways":["سلسلة <code dir=\"ltr\">if</code> تفحص الشروط من الأعلى إلى الأسفل ولا تنفّذ إلا أول كتلة شرطها صحيح، لذلك ضع الحالة الأضيق أولًا.","<code dir=\"ltr\">&amp;&amp;</code> تحتاج أن يكون الطرفان صحيحين، و<code dir=\"ltr\">||</code> تحتاج طرفًا صحيحًا واحدًا على الأقل، و<code dir=\"ltr\">!</code> تقلب القيمة المنطقية.","استخدم العامل الثلاثي <code dir=\"ltr\">condition ? a : b</code> للاختيار بين قيمتين، و<code dir=\"ltr\">if</code> للاختيار بين فعلين.","ثماني قيم فقط هي falsy (<code dir=\"ltr\">false</code> و<code dir=\"ltr\">0</code> و<code dir=\"ltr\">-0</code> و<code dir=\"ltr\">0n</code> و<code dir=\"ltr\">&quot;&quot;</code> و<code dir=\"ltr\">null</code> و<code dir=\"ltr\">undefined</code> و<code dir=\"ltr\">NaN</code>)؛ وكل ما عداها truthy، بما في ذلك <code dir=\"ltr\">&quot;0&quot;</code> و<code dir=\"ltr\">[]</code>."],"further":[{"title":"if...else (MDN)","url":"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/if...else"},{"title":"Truthy (MDN glossary)","url":"https://developer.mozilla.org/en-US/docs/Glossary/Truthy"},{"title":"Conditional (ternary) operator (MDN)","url":"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_operator"}],"quiz":[{"q":"<p>إذا كانت <code dir=\"ltr\">spent = 2100</code> و<code dir=\"ltr\">budget = 2000</code>، فماذا يطبع هذا الكود؟</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"js\" data-index=\"0\"><div class=\"code-head\"><span class=\"code-title\">JavaScript</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">if</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> (spent </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">></span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> budget </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">*</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 0.8</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">) {</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  console.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">log</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"close\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">);</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">} </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">else</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> if</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> (spent </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">></span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> budget) {</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  console.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">log</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"over\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">);</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">} </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">else</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> {</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">  console.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">log</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"ok\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">);</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">}</span></span></code></pre></div>\n","options":[{"text":"<code dir=\"ltr\">over</code>","why":"تتوقّف السلسلة عند أول شرط صحيح. 2100 أكبر من 1600، فتُنفَّذ الكتلة الأولى ولا يُفحص الـ <code dir=\"ltr\">else if</code> أبدًا."},{"text":"<code dir=\"ltr\">close</code>","why":"صحيح، وهذا خطأ برمجي (bug). الشرط الأوسع جاء أولًا فابتلع حالة تجاوز الميزانية. افحص <code dir=\"ltr\">spent &gt; budget</code> أولًا."},{"text":"<code dir=\"ltr\">close</code> ثم <code dir=\"ltr\">over</code>","why":"سلسلة <code dir=\"ltr\">if</code>/<code dir=\"ltr\">else if</code> تنفّذ كتلة واحدة على الأكثر. وحدها تعليمات <code dir=\"ltr\">if</code> المنفصلة يمكن أن تُنفَّذ كلها."},{"text":"<code dir=\"ltr\">ok</code>","why":"<code dir=\"ltr\">else</code> لا تُنفَّذ إلا حين تكون كل الشروط التي فوقها خاطئة، والشرط الأول هنا صحيح."}],"answer":1},{"q":"<p>أيّ هذه القيم truthy؟</p>","options":[{"text":"<code dir=\"ltr\">&quot;&quot;</code> (نص فارغ)","why":"النص الفارغ إحدى القيم الثماني الـ falsy."},{"text":"<code dir=\"ltr\">0</code>","why":"الصفر falsy، ولهذا بالضبط يسيء <code dir=\"ltr\">if (amount)</code> التصرّف مع مبلغ حقيقي قيمته 0."},{"text":"<code dir=\"ltr\">&quot;0&quot;</code> (نص يحتوي على صفر)","why":"صحيح. أي نص غير فارغ truthy، حتى <code dir=\"ltr\">&quot;0&quot;</code> و<code dir=\"ltr\">&quot;false&quot;</code>."},{"text":"<code dir=\"ltr\">NaN</code>","why":"<code dir=\"ltr\">NaN</code> قيمة falsy، مثل <code dir=\"ltr\">false</code> و<code dir=\"ltr\">0</code> و<code dir=\"ltr\">-0</code> و<code dir=\"ltr\">0n</code> و<code dir=\"ltr\">&quot;&quot;</code> و<code dir=\"ltr\">null</code> و<code dir=\"ltr\">undefined</code>."}],"answer":2},{"q":"<p>يستطيع المستخدم أن يحدّد سقفًا يوميًا للإنفاق، و<code dir=\"ltr\">0</code> اختيار صالح يعني “لا إنفاق اليوم”. ماذا يفعل <code dir=\"ltr\">const limit = userLimit || 5000;</code> حين تكون <code dir=\"ltr\">userLimit</code> تساوي <code dir=\"ltr\">0</code>؟</p>","options":[{"text":"يُبقي على 0، لأن 0 رقم.","why":"<code dir=\"ltr\">||</code> لا تفحص الأنواع؛ إنها تفحص إن كانت القيمة truthy، و0 قيمة falsy."},{"text":"يرمي خطأ، لأن <code dir=\"ltr\">||</code> لا تعمل إلا مع القيم المنطقية.","why":"<code dir=\"ltr\">||</code> تعمل مع أي قيم وتُرجع إحداها، وليس بالضرورة قيمة منطقية."},{"text":"يجعل <code dir=\"ltr\">limit</code> يساوي 5000، متجاهلًا اختيار المستخدم بصمت.","why":"صحيح. <code dir=\"ltr\">||</code> تلجأ إلى البديل كلما كان الطرف الأيسر falsy، و0 قيمة falsy. أما العامل <code dir=\"ltr\">??</code>، الذي ستتعلّمه في القسم 3، فلا يلجأ إلى البديل إلا مع null وundefined."}],"answer":2},{"q":"<p>أيّ سطر يستخدم العامل الثلاثي بأفضل شكل؟</p>","options":[{"text":"<code dir=\"ltr\">const label = isOver ? &quot;Over budget&quot; : &quot;On track&quot;;</code>","why":"صحيح. العامل الثلاثي يختار إحدى قيمتين ويُخزَّن الناتج. وهذا بالضبط ما وُجد من أجله."},{"text":"<code dir=\"ltr\">isOver ? sendAlert() : logQuietly();</code>","why":"هذا يعمل، لكنه يستخدم عاملًا مخصّصًا لاختيار القيم كي يختار بين أفعال. و<code dir=\"ltr\">if</code>/<code dir=\"ltr\">else</code> تعبّر عن هذه النية بوضوح أكبر."},{"text":"<code dir=\"ltr\">const label = a ? b ? &quot;x&quot; : &quot;y&quot; : c ? &quot;z&quot; : &quot;w&quot;;</code>","why":"العوامل الثلاثية المتداخلة مسموحة لكنها صعبة القراءة. استخدم سلسلة <code dir=\"ltr\">if</code>/<code dir=\"ltr\">else if</code> متى زادت النتائج على اثنتين."}],"answer":0}],"exercise":{"kind":"web","mode":"js","starter":{"js":"// The function wrapper is written for you (functions get their own lesson soon).\n// spentCents and budgetCents arrive as numbers. Use if / else if / else\n// and `return` the status string.\nfunction budgetStatus(spentCents, budgetCents) {\n  return \"ok\";\n}\n\n// Use a ternary to pick the label for one value\nfunction amountLabel(amountCents) {\n  return \"\";\n}\n\nconsole.log(budgetStatus(1750, 2000));\nconsole.log(amountLabel(12500));\n"},"solution":{"js":"function budgetStatus(spentCents, budgetCents) {\n  if (spentCents > budgetCents) {\n    return \"over\";\n  } else if (spentCents >= budgetCents * 0.8) {\n    return \"close\";\n  } else {\n    return \"ok\";\n  }\n}\n\nfunction amountLabel(amountCents) {\n  return amountCents >= 10000 ? \"big\" : \"small\";\n}\n\nconsole.log(budgetStatus(1750, 2000));\nconsole.log(amountLabel(12500));\n"},"checks":[{"id":"over","test":"return budgetStatus(2001, 2000) === 'over' && budgetStatus(5000, 2000) === 'over';\n"},{"id":"close","test":"return budgetStatus(1600, 2000) === 'close' && budgetStatus(2000, 2000) === 'close' && budgetStatus(1750, 2000) === 'close';\n"},{"id":"ok","test":"return budgetStatus(1599, 2000) === 'ok' && budgetStatus(0, 2000) === 'ok';\n"},{"id":"label","test":"return amountLabel(12500) === 'big' && amountLabel(10000) === 'big' && amountLabel(9999) === 'small' && amountLabel(0) === 'small';\n"}],"title":"هل Pocket ضمن الميزانية؟","prompt":"<p>أكمل الدالة <code dir=\"ltr\">budgetStatus(spentCents, budgetCents)</code> بحيث تُرجع <code dir=\"ltr\">&quot;over&quot;</code> حين يكون الإنفاق <strong>أكبر من</strong> الميزانية، و<code dir=\"ltr\">&quot;close&quot;</code> حين يبلغ 80% من الميزانية على الأقل (دون أن يتجاوزها)، و<code dir=\"ltr\">&quot;ok&quot;</code> فيما عدا ذلك. إنفاق الميزانية بالضبط يُعدّ <code dir=\"ltr\">&quot;close&quot;</code>، لا تجاوزًا.</p>\n<p>ثم أكمل <code dir=\"ltr\">amountLabel(amountCents)</code> باستخدام <strong>العامل الثلاثي</strong>: أرجع <code dir=\"ltr\">&quot;big&quot;</code> لمبلغ 10000 سنت (100 دولار) أو أكثر، و<code dir=\"ltr\">&quot;small&quot;</code> فيما عدا ذلك. كتابة <code dir=\"ltr\">return</code> متبوعة بقيمة تُعيد تلك القيمة إلى من استدعى الدالة.</p>\n","hints":["افحص الحالة الأضيق أولًا. تجاوز الميزانية هو أيضًا “80% على الأقل”، لذلك افحص <code dir=\"ltr\">spentCents &gt; budgetCents</code> قبل فحص الـ 80%.","80% من الميزانية هي <code dir=\"ltr\">budgetCents * 0.8</code>. استخدم <code dir=\"ltr\">&gt;=</code> كي تُعدّ نسبة 80% بالضبط “close”.","العامل الثلاثي يُكتب هكذا: <code dir=\"ltr\">condition ? valueIfTrue : valueIfFalse</code>، أي: <code dir=\"ltr\">return amountCents &gt;= 10000 ? &quot;big&quot; : &quot;small&quot;;</code>."],"explanation":"<p>تفحص السلسلة <code dir=\"ltr\">spentCents &gt; budgetCents</code> أولًا لأنه الشرط الأضيق: كل مبلغ يتجاوز الميزانية يبلغ أيضًا 80% منها على الأقل، فلو فُحصت قاعدة الـ 80% أولًا لوُصف الإنفاق الزائد بأنه “close” فحسب. واستخدام <code dir=\"ltr\">&gt;</code> لـ “over” و<code dir=\"ltr\">&gt;=</code> لـ “close” يجعل الحدود دقيقة: 2000 من 2000 تعني close، و2001 تعني over، و1600 (أي 80% بالضبط) تعني close. أما العامل الثلاثي في <code dir=\"ltr\">amountLabel</code> فيختار إحدى قيمتين ويُرجعها مباشرة، وهذه هي المهمة التي صُمّم من أجلها.</p>\n","checkLabels":{"over":"تُرجع “over” حين يكون الإنفاق أكبر من الميزانية","close":"تُرجع “close” من 80% وحتى الميزانية نفسها","ok":"تُرجع “ok” تحت 80%","label":"<code dir=\"ltr\">amountLabel</code> تُرجع “big” من 10000 سنت فصاعدًا و&quot;small&quot; لما دون ذلك"}},"words":667,"readMinutes":4}