{"id":"l-js-1-4","courseId":"javascript-fundamentals","lang":"ar","kind":"lesson","summary":"تُنشئ النصوص وتنظّفها، وتقرأ الحروف عبر الفهرس، وتستخدم دوال النصوص اليومية، وتبني مخرجات مقروءة مثل “Lunch: $12.20” باستخدام الـ template literals.","html":"<p>صارت أرقام Pocket دقيقة، لكن لا أحد يريد أن يقرأ <code dir=\"ltr\">1220</code>. الناس يريدون <code dir=\"ltr\">Lunch: $12.20</code>. النص في JavaScript اسمه <strong>string</strong> (سلسلة نصية)، ومعظم ما يراه المستخدم من برنامجك هو نصوص بنيتها أنت.</p>\n<h2 id=\"sec-1\" tabindex=\"-1\">كتابة النصوص</h2>\n<p>يمكنك كتابة النص بعلامات تنصيص مفردة أو مزدوجة أو بعلامات backtick:</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\"> a</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> 'Coffee'</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\"> b</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"Sam's lunch\"</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\"> c</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> `Bus`</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\">(a, b, c);</span></span></code></pre><div class=\"run-output\" data-run-output=\"0\" hidden></div></div>\n<p>العلامات المفردة والمزدوجة تتصرّفان بالطريقة نفسها؛ اختر أسلوبًا والتزم به (هذه الدورة تستخدم العلامات المزدوجة). واستخدم النوع الآخر حين يحتوي نصّك على علامة تنصيص، كما في <code dir=\"ltr\">&quot;Sam's lunch&quot;</code>، أو “اهرب” منها بشرطة مائلة عكسية: <code dir=\"ltr\">'Sam\\'s lunch'</code>. و<code dir=\"ltr\">\\n</code> داخل النص تعني سطرًا جديدًا.</p>\n<p>أما علامات backtick فلها شأن خاص، وستستخدمها أكثر من غيرها. إنها تصنع <strong>الـ template literals</strong> (القوالب النصية).</p>\n<h2 id=\"sec-2\" tabindex=\"-1\">الـ Template literals: قيم داخل النص</h2>\n<p>لصق النصوص باستخدام <code dir=\"ltr\">+</code> يصبح فوضويًا بسرعة: <code dir=\"ltr\">&quot;Lunch: $&quot; + dollars + &quot; (&quot; + category + &quot;)&quot;</code>. من السهل أن تنسى مسافة أو علامة تنصيص. أما الـ template literal فيتيح لك كتابة النص مرة واحدة وإسقاط القيم فيه عبر <code dir=\"ltr\">${ }</code>:</p>\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\"> label</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"Lunch\"</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\"> cents</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 1220</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\"> \"food\"</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\">const</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> line</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> `${</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">label</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">}: $${</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">(</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">cents</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> /</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 100</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">).</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">toFixed</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">2</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">)</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">} (${</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">category</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:#1F2328;--shiki-dark:#E6EDF3\">console.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">log</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(line);</span></span></code></pre><div class=\"run-output\" data-run-output=\"1\" hidden></div></div>\n<p>كل ما داخل <code dir=\"ltr\">${ }</code> تعبير JavaScript كامل: يُحسب، ثم يُحوَّل إلى نص، ثم يُدرج. هنا تقسم <code dir=\"ltr\">(cents / 100).toFixed(2)</code> لتحصل على <code dir=\"ltr\">12.2</code>، ثم تحوّلها <code dir=\"ltr\">toFixed(2)</code> إلى النص <code dir=\"ltr\">&quot;12.20&quot;</code> بمنزلتين عشريتين بالضبط. علامة <code dir=\"ltr\">$</code> الأولى مجرّد علامة دولار عادية؛ فقط <code dir=\"ltr\">$</code> المتبوعة بـ <code dir=\"ltr\">{</code> هي التي تبدأ الإدراج.</p>\n<p>ويمكن للـ template literals أيضًا أن تمتد على عدّة أسطر، وهذا مفيد للرسائل متعدّدة الأسطر:</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\"> report</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> `Pocket summary</span></span>\n<span class=\"line\"><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">  Spent: $22.00</span></span>\n<span class=\"line\"><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">  Left:  $3.00`</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\">(report);</span></span></code></pre><div class=\"run-output\" data-run-output=\"2\" hidden></div></div>\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>منسّق عملات حقيقي</span></p>\n<p><code dir=\"ltr\">toFixed</code> كافية لـ Pocket. أما في التطبيقات الحقيقية التي تعرض عملات كثيرة، فاستخدم المنسّق المدمج في اللغة، فهو يعرف رمز كل عملة وفواصلها:</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\"> usd</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> new</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> Intl.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">NumberFormat</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"en-US\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, { style: </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"currency\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, currency: </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"USD\"</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\">(usd.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">format</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">1220</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> /</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 100</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\">(usd.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">format</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">1234567</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> /</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 100</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">));</span></span></code></pre><div class=\"run-output\" data-run-output=\"3\" hidden></div></div>\n</aside>\n<h2 id=\"sec-3\" tabindex=\"-1\">الحروف والمواضع والمقاطع</h2>\n<p>النص سلسلة من الحروف، ولكل حرف موضع يُسمّى <strong>الفهرس</strong> (index)، يبدأ العدّ فيه من 0. و<code dir=\"ltr\">length</code> تخبرك بعدد الحروف.</p>\n<figure class=\"diagram\"><svg class=\"diagram-svg\" focusable=\"false\" viewBox=\"0 0 640 200\" role=\"img\" aria-labelledby=\"l-js-1-4-t1\"><defs><marker id=\"arrow-l-js-1-4-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-1-4-t1\">النص Coffee فيه ستة حروف في الفهارس من 0 إلى 5. التعبير slice(0, 3) ينسخ الفهارس 0 و1 و2 فيعطي Cof، ويتوقّف قبل الفهرس 3.</title>\n  <rect class=\"d-box-primary\" x=\"110\" y=\"40\" width=\"70\" height=\"56\" rx=\"8\"/>\n  <text class=\"d-code\" x=\"145\" y=\"74\" text-anchor=\"middle\">C</text>\n  <rect class=\"d-box-primary\" x=\"180\" y=\"40\" width=\"70\" height=\"56\" rx=\"8\"/>\n  <text class=\"d-code\" x=\"215\" y=\"74\" text-anchor=\"middle\">o</text>\n  <rect class=\"d-box-primary\" x=\"250\" y=\"40\" width=\"70\" height=\"56\" rx=\"8\"/>\n  <text class=\"d-code\" x=\"285\" y=\"74\" text-anchor=\"middle\">f</text>\n  <rect class=\"d-box\" x=\"320\" y=\"40\" width=\"70\" height=\"56\" rx=\"8\"/>\n  <text class=\"d-code\" x=\"355\" y=\"74\" text-anchor=\"middle\">f</text>\n  <rect class=\"d-box\" x=\"390\" y=\"40\" width=\"70\" height=\"56\" rx=\"8\"/>\n  <text class=\"d-code\" x=\"425\" y=\"74\" text-anchor=\"middle\">e</text>\n  <rect class=\"d-box\" x=\"460\" y=\"40\" width=\"70\" height=\"56\" rx=\"8\"/>\n  <text class=\"d-code\" x=\"495\" y=\"74\" text-anchor=\"middle\">e</text>\n  <text class=\"d-label-muted\" x=\"145\" y=\"122\" text-anchor=\"middle\">0</text>\n  <text class=\"d-label-muted\" x=\"215\" y=\"122\" text-anchor=\"middle\">1</text>\n  <text class=\"d-label-muted\" x=\"285\" y=\"122\" text-anchor=\"middle\">2</text>\n  <text class=\"d-label-muted\" x=\"355\" y=\"122\" text-anchor=\"middle\">3</text>\n  <text class=\"d-label-muted\" x=\"425\" y=\"122\" text-anchor=\"middle\">4</text>\n  <text class=\"d-label-muted\" x=\"495\" y=\"122\" text-anchor=\"middle\">5</text>\n  <text class=\"d-label-muted\" x=\"60\" y=\"122\" text-anchor=\"middle\">الفهرس</text>\n  <path class=\"d-line\" d=\"M110 150 L320 150\"/>\n  <text class=\"d-code\" x=\"215\" y=\"178\" text-anchor=\"middle\">slice(0, 3) → \"Cof\"</text>\n  <path class=\"d-dashed\" d=\"M320 30 L320 160\"/>\n  <text class=\"d-label-muted\" x=\"420\" y=\"178\" text-anchor=\"middle\">تتوقّف قبل 3</text>\n</svg><figcaption>الفهارس تبدأ من 0، وslice تتوقّف قبل فهرس النهاية</figcaption></figure>\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\"> word</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"Coffee\"</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\">(word.</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">length</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">);      </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\">// 6</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\">(word[</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\">// first character</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\">(word.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">at</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">-</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">1</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">));      </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\">// last character</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\">(word.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">slice</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:#0550AE;--shiki-dark:#79C0FF\">3</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)); </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\">// from index 0 up to, not including, 3</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\">(word.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">slice</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">3</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">));    </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\">// from index 3 to the end</span></span></code></pre><div class=\"run-output\" data-run-output=\"4\" hidden></div></div>\n<p><code dir=\"ltr\">word.at(-1)</code> تعدّ من النهاية، وهذا يُغنيك عن كتابة <code dir=\"ltr\">word[word.length - 1]</code>.</p>\n<h2 id=\"sec-4\" tabindex=\"-1\">دوال تُرجع نصوصًا جديدة</h2>\n<p>تأتي النصوص مع <strong>methods</strong> (دوال مدمجة) جاهزة، وهي دوال تستدعيها بنقطة. هذه التي ستستخدمها أسبوعيًا:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"js\" data-run=\"js\" data-index=\"5\"><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=\"5\" 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\"> raw</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"  Coffee with Sam  \"</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\"> clean</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> raw.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">trim</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">();</span></span>\n<span class=\"line\"></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\">(clean);                      </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\">// spaces removed from both ends</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\">(clean.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">toUpperCase</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\">(clean.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">includes</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Sam\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">));      </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\">// true or false</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\">(clean.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">startsWith</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Coffee\"</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\">(clean.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">replaceAll</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 style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"-\"</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\">\"7\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">padStart</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">3</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:#6E7781;--shiki-dark:#8B949E\">// \"007\"</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\">`[${</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">raw</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">}]`</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">);                 </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\">// the original is untouched</span></span></code></pre><div class=\"run-output\" data-run-output=\"5\" hidden></div></div>\n<p>السطر الأخير هو الفكرة الأساسية: النصوص <strong>غير قابلة للتعديل</strong> (immutable). لا توجد method تغيّر نصًا أبدًا؛ كل واحدة تُرجع نصًا جديدًا. فإن أردت الاحتفاظ بالناتج، فخزّنه.</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>استدعاء method ثم رمي الناتج</span></p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"js\" data-index=\"6\"><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\">let</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> label </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"  coffee \"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">;</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">label.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">trim</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">();          </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\">// returns \"coffee\"... and nobody keeps it</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">label.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">toUpperCase</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">();   </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\">// same again</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\">(label);    </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\">// still \"  coffee \"</span></span></code></pre></div>\n<p>اكتب <code dir=\"ltr\">label = label.trim();</code>، أو الأفضل أن تخزّن الناتج باسم <code dir=\"ltr\">const</code> جديد: <code dir=\"ltr\">const cleanLabel = label.trim();</code>.</p>\n</aside>\n<p>الجمع بين عدّة methods أمر شائع. لتجعل الحرف الأول من تسمية ما حرفًا كبيرًا، خذ الحرف الأول، وحوّله إلى حرف كبير، وأضف إليه الباقي:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"js\" data-run=\"js\" data-index=\"7\"><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=\"7\" 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\"> label</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"groceries\"</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\"> nice</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> label[</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\">toUpperCase</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">() </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">+</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> label.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">slice</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">1</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\">(nice);</span></span></code></pre><div class=\"run-output\" data-run-output=\"7\" hidden></div></div>\n<p>وهناك دالتان أخريان تجيبان عن سؤال “أين هو؟” بدلًا من “هل هو موجود؟”. <code dir=\"ltr\">indexOf(&quot;Sam&quot;)</code> تُرجع الفهرس الذي يظهر فيه النص لأول مرة، أو <code dir=\"ltr\">-1</code> إن لم يكن موجودًا أصلًا. و<code dir=\"ltr\">split(&quot; &quot;)</code> تقطّع النص إلى أجزاء أينما وجدت الفاصل، وتُعيد إليك قائمة: <code dir=\"ltr\">[&quot;Coffee&quot;, &quot;with&quot;, &quot;Sam&quot;]</code>. تُسمّى القوائم مصفوفات (arrays)، ولها درس كامل في القسم 3.</p>\n<h2 id=\"sec-5\" tabindex=\"-1\">من النصوص إلى الأرقام وبالعكس</h2>\n<p>يعبر Pocket الحدود بين النصوص والأرقام باستمرار. المبالغ أرقام حين تحسب، ونصوص حين تعرضها؛ والمدخلات المكتوبة نصوص إلى أن تحوّلها.</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"js\" data-run=\"js\" data-index=\"8\"><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=\"8\" 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\"> cents</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 450</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:#8250DF;--shiki-dark:#D2A8FF\">String</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(cents), </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">typeof</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\"> String</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(cents));  </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\">// number to string</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\">`${</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">cents</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">}`</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">.</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">length</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">);                    </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\">// a template literal converts too</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\">Number</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"4.50\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">) </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">*</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 100</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">);                 </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\">// string to number</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\">Number</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"  12 \"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">));                      </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\">// spaces around digits are ignored</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\">Number</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 style=\"color:#6E7781;--shiki-dark:#8B949E\">// careful: an empty string becomes 0</span></span></code></pre><div class=\"run-output\" data-run-output=\"8\" hidden></div></div>\n<p>السطر الأخير فخّ يستحق أن تتذكّره. حقل النص الفارغ يتحوّل إلى <code dir=\"ltr\">0</code> لا إلى <code dir=\"ltr\">NaN</code>، فيبدو “المستخدم لم يكتب شيئًا” مطابقًا تمامًا لـ “المستخدم كتب صفرًا”. وحين تتحقّق من النماذج في القسم 4، ستفحص المدخلات الفارغة قبل التحويل.</p>\n<h2 id=\"sec-6\" tabindex=\"-1\">مقارنة النصوص</h2>\n<p><code dir=\"ltr\">===</code> تقارن النصوص حرفًا حرفًا، وهي حسّاسة لحالة الأحرف: <code dir=\"ltr\">&quot;Food&quot; === &quot;food&quot;</code> تساوي <code dir=\"ltr\">false</code>. والمستخدمون يكتبون الفئات كيفما شاؤوا، لذلك <strong>وحّد الشكل قبل أن تقارن</strong>: احذف المسافات واختر حالة أحرف واحدة.</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"js\" data-run=\"js\" data-index=\"9\"><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=\"9\" 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\"> typed</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> =</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\">console.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">log</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(typed </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">===</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"food\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">);                       </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\">// false</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\">(typed.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">trim</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">().</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">toLowerCase</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">() </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">===</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"food\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">);  </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\">// true</span></span></code></pre><div class=\"run-output\" data-run-output=\"9\" hidden></div></div>\n<p>ويمكنك أيضًا استخدام <code dir=\"ltr\">&lt;</code> و<code dir=\"ltr\">&gt;</code> مع النصوص. إنهما تقارنان رموز الحروف موضعًا بموضع، وهذا ينجح مع الكلمات البسيطة ذات الأحرف الصغيرة (<code dir=\"ltr\">&quot;apple&quot; &lt; &quot;banana&quot;</code> صحيحة)، ويفشل سريعًا فيما عدا ذلك: <code dir=\"ltr\">&quot;Zebra&quot; &lt; &quot;apple&quot;</code> صحيحة أيضًا، لأن كل حرف كبير له رمز أصغر من كل حرف صغير. يُريك القسم 3 الطريقة الصحيحة لترتيب النصوص، باستخدام <code dir=\"ltr\">localeCompare</code>، التي تتبع قواعد لغة حقيقية.</p>\n<p>يستطيع Pocket الآن أن يحمل المبالغ، ويحسب بها بدقة، ويطبعها بشكل يقرؤه الناس. لكن ما لا يستطيعه بعد هو أن يتفاعل: أن ينبّهك حين تتجاوز ميزانيتك، أو أن يعامل الطعام بشكل مختلف عن الإيجار. في القسم التالي يبدأ برنامجك باتخاذ القرارات.</p>\n","toc":[{"id":"sec-1","text":"كتابة النصوص","level":2},{"id":"sec-2","text":"الـ Template literals: قيم داخل النص","level":2},{"id":"sec-3","text":"الحروف والمواضع والمقاطع","level":2},{"id":"sec-4","text":"دوال تُرجع نصوصًا جديدة","level":2},{"id":"sec-5","text":"من النصوص إلى الأرقام وبالعكس","level":2},{"id":"sec-6","text":"مقارنة النصوص","level":2}],"takeaways":["يمكن كتابة النصوص بعلامات تنصيص مفردة أو مزدوجة أو بعلامات backtick؛ وعلامات backtick تصنع الـ template literals، التي تستطيع إدراج القيم عبر <code dir=\"ltr\">${}</code> وتمتد على عدّة أسطر.","النصوص غير قابلة للتعديل (immutable)، لذلك تُرجع دوال مثل <code dir=\"ltr\">trim()</code> و<code dir=\"ltr\">toUpperCase()</code> نصًا جديدًا وتترك الأصلي كما هو.","تُرقَّم الحروف بدءًا من 0، و<code dir=\"ltr\">length</code> تعدّها، و<code dir=\"ltr\">slice(start, end)</code> تنسخ جزءًا حتى <code dir=\"ltr\">end</code> دون أن تشمله.","نسّق السنتات للعرض باستخدام <code dir=\"ltr\">(cents / 100).toFixed(2)</code> أو <code dir=\"ltr\">Intl.NumberFormat</code>، وأبقِ المبلغ المخزّن رقمًا."],"further":[{"title":"Template literals (MDN)","url":"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals"},{"title":"String (MDN)","url":"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String"},{"title":"Intl.NumberFormat (MDN)","url":"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat"}],"quiz":[{"q":"<p>ماذا يطبع هذا الكود؟</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\">let</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> label </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"  lunch \"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">;</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">label.</span><span style=\"color:#8250DF;--shiki-dark:#D2A8FF\">trim</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\">`[${</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">label</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">}]`</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">);</span></span></code></pre></div>\n","options":[{"text":"<code dir=\"ltr\">[lunch]</code>","why":"<code dir=\"ltr\">trim()</code> تُرجع نصًا جديدًا مشذّبًا، لكن لا شيء يخزّنه، فيبقى <code dir=\"ltr\">label</code> بمسافاته."},{"text":"<code dir=\"ltr\">[  lunch ]</code>","why":"صحيح. النصوص غير قابلة للتعديل. اكتب <code dir=\"ltr\">label = label.trim();</code> لتحتفظ بالناتج."},{"text":"<code dir=\"ltr\">[${label}]</code>","why":"علامات backtick تصنع template literal، فيُستبدل <code dir=\"ltr\">${label}</code> بقيمة <code dir=\"ltr\">label</code>."}],"answer":1},{"q":"<p><code dir=\"ltr\">const word = &quot;Pocket&quot;;</code> أيّ تعبير يعطي <code dir=\"ltr\">&quot;Poc&quot;</code>؟</p>","options":[{"text":"<code dir=\"ltr\">word.slice(1, 3)</code>","why":"الفهارس تبدأ من 0، لذلك يبدأ هذا من “o” ويتوقّف قبل الفهرس 3، فيعطي “oc”."},{"text":"<code dir=\"ltr\">word.slice(0, 2)</code>","why":"فهرس النهاية مستثنى، لذلك يعطي هذا “Po” فقط."},{"text":"<code dir=\"ltr\">word[0, 3]</code>","why":"الأقواس المربّعة تقرأ حرفًا واحدًا. وتعبير الفاصلة ناتجه 3، فيُرجع هذا “k”."},{"text":"<code dir=\"ltr\">word.slice(0, 3)</code>","why":"صحيح. إنه ينسخ الفهارس 0 و1 و2 ويتوقّف قبل 3."}],"answer":3},{"q":"<p>تحتاج إلى عرض 1220 سنتًا على شكل <code dir=\"ltr\">$12.20</code>. أيّ هذه صحيح؟</p>","options":[{"text":"<code dir=\"ltr\">&quot;$&quot; + (1220 / 100).toFixed(2)</code>","why":"صحيح. القسمة تعطي 12.2، و<code dir=\"ltr\">toFixed(2)</code> تُرجع النص “12.20” بمنزلتين عشريتين بالضبط."},{"text":"<code dir=\"ltr\">&quot;$&quot; + 1220 / 100</code>","why":"هذا يطبع “$12.2”، لأن الأرقام تُسقط الأصفار في آخرها حين تتحوّل إلى نص."},{"text":"<code dir=\"ltr\">&quot;$&quot; + 1220.toFixed(2)</code>","why":"هذا ينسّق السنتات لا الدولارات، ثم إن النقطة مباشرة بعد عدد صحيح مكتوب حرفيًا خطأ في الصياغة أصلًا."}],"answer":0}],"exercise":{"kind":"web","mode":"js","starter":{"js":"// An expense as it arrived from a messy form\nconst rawLabel = \"   coffee with Sam \";\nconst cents = 450;\nconst category = \"FOOD\";\n\n// Build line so it reads exactly: Coffee with Sam: $4.50 (food)\nconst line = rawLabel + \": \" + cents + \" (\" + category + \")\";\nconsole.log(line);\n"},"solution":{"js":"const rawLabel = \"   coffee with Sam \";\nconst cents = 450;\nconst category = \"FOOD\";\n\nconst trimmed = rawLabel.trim();\nconst label = trimmed[0].toUpperCase() + trimmed.slice(1);\nconst price = (cents / 100).toFixed(2);\n\nconst line = `${label}: $${price} (${category.toLowerCase()})`;\nconsole.log(line);\n"},"checks":[{"id":"trimmed","test":"return typeof line === 'string' && line === line.trim() && line.startsWith('C');"},{"id":"price","test":"return typeof line === 'string' && line.includes('$4.50');"},{"id":"exact","test":"return line === 'Coffee with Sam: $4.50 (food)';\n"},{"id":"logged","test":"return logs.some((l) => l === 'Coffee with Sam: $4.50 (food)');\n"}],"title":"نسّق سطر مصروف","prompt":"<p>وصل مصروف من نموذج إدخال بنصّ فوضوي. ابنِ النص <code dir=\"ltr\">line</code> بحيث يكون بالضبط <code dir=\"ltr\">Coffee with Sam: $4.50 (food)</code>، ثم اطبعه. استخدم المتغيّرات المعطاة: شذّب <code dir=\"ltr\">rawLabel</code> واجعل حرفه الأول كبيرًا، واعرض <code dir=\"ltr\">cents</code> بالدولار بمنزلتين عشريتين، وحوّل <code dir=\"ltr\">category</code> إلى أحرف صغيرة. الـ template literal يُبقي هذا مقروءًا.</p>\n","hints":["ابدأ بـ <code dir=\"ltr\">const trimmed = rawLabel.trim();</code> كي يكون الحرف الأول هو c لا مسافة.","<code dir=\"ltr\">trimmed[0].toUpperCase() + trimmed.slice(1)</code> تجعل الحرف الأول كبيرًا. و<code dir=\"ltr\">(cents / 100).toFixed(2)</code> تعطي <code dir=\"ltr\">&quot;4.50&quot;</code>.","اجمع كل شيء بعلامات backtick: <code dir=\"ltr\">`${label}: $${price} (${category.toLowerCase()})`</code>."],"explanation":"<p>كل method من methods النصوص تُرجع نصًا جديدًا، لذلك يخزّن الحل كل خطوة باسم خاص بها: <code dir=\"ltr\">trimmed</code>، ثم <code dir=\"ltr\">label</code>. ومن المهم أن يأتي التشذيب أولًا، لأن الفهرس 0 في النص الخام مسافة. تحوّل <code dir=\"ltr\">toFixed(2)</code> القيمة <code dir=\"ltr\">4.5</code> إلى النص <code dir=\"ltr\">&quot;4.50&quot;</code>، وهو ما يتوقّع الناس رؤيته في المبالغ المالية. ثم يُقرأ الـ template literal كأنه المخرجات نفسها؛ فعلامة <code dir=\"ltr\">$</code> الأولى في <code dir=\"ltr\">$${price}</code> علامة دولار حرفية، والثانية تبدأ الإدراج.</p>\n","checkLabels":{"trimmed":"يبدأ بحرف C كبير ولا توجد فيه مسافات زائدة","price":"يعرض المبلغ على شكل $4.50","exact":"<code dir=\"ltr\">line</code> يساوي بالضبط “Coffee with Sam: $4.50 (food)”","logged":"يطبع السطر"}},"words":634,"readMinutes":4}