{"id":"l-js-1-1","courseId":"javascript-fundamentals","lang":"ar","kind":"intro","summary":"تعرف ما هي JavaScript، وأين تعمل (في المتصفّح وفي Node.js)، وكيف تشغّل أول سطر كود لك، وما الذي ستبنيه في هذه الدورة.","html":"<p>كل موقع استخدمته اليوم شغّل JavaScript. حين يزيد عدّاد “الإعجابات” دون أن يُعاد تحميل الصفحة، وحين يخبرك نموذج التسجيل أن كلمة المرور قصيرة قبل أن تضغط “إرسال”، وحين تتحرّك الخريطة تحت إصبعك، فهذه JavaScript تعمل داخل متصفّحك. إنها لغة البرمجة الوحيدة التي يفهمها كل متصفّح، ولهذا هي أفضل لغة أولى لكل من يريد أن يبني للويب.</p>\n<p>ستتعلّمها بالطريقة البطيئة المتينة: بأن تراقب ما يفعله الحاسوب فعلًا بكل سطر تكتبه.</p>\n<h2 id=\"sec-1\" tabindex=\"-1\">لغة واحدة وبيتان</h2>\n<p>JavaScript لغة: مجموعة قواعد لكتابة التعليمات. ولا بدّ من شيء يقرأ هذه التعليمات وينفّذها، وهذا الشيء هو <strong>محرّك JavaScript</strong> (JavaScript engine). يستخدم Chrome وEdge محرّكًا اسمه V8، ويستخدم Firefox محرّك SpiderMonkey، ويستخدم Safari محرّك JavaScriptCore. وكلها تتبع المعيار الرسمي نفسه، واسمه ECMAScript، الذي يصدر منه إصدار جديد كل عام.</p>\n<p>المحرّك لا يعمل وحده أبدًا. إنه يعيش داخل <strong>بيئة مضيفة</strong> (host) تمنح كودك قدرات إضافية:</p>\n<ul>\n<li>في <strong>المتصفّح</strong>، تضيف البيئة المضيفة الصفحة نفسها (<code dir=\"ltr\">document</code>)، والنقرات وضغطات المفاتيح، والشبكة (<code dir=\"ltr\">fetch</code>)، ومساحة تخزين صغيرة (<code dir=\"ltr\">localStorage</code>).</li>\n<li>في <strong>Node.js</strong>، يعمل محرّك V8 نفسه على حاسوب أو خادم بلا أي صفحة. وبدلًا من ذلك، تضيف البيئة المضيفة الملفات والخوادم وأدوات سطر الأوامر.</li>\n</ul>\n<figure class=\"diagram\"><svg class=\"diagram-svg\" focusable=\"false\" viewBox=\"0 0 640 250\" role=\"img\" aria-labelledby=\"l-js-1-1-t1\"><defs><marker id=\"arrow-l-js-1-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-1-1-t1\">كود JavaScript الخاص بك يعمل على محرّك JavaScript. في المتصفّح يحيط بالمحرّك الصفحة والأحداث وfetch وlocalStorage؛ وفي Node.js تحيط به الملفات والخوادم وسطر الأوامر.</title>\n  <rect class=\"d-box-primary\" x=\"230\" y=\"14\" width=\"180\" height=\"48\" rx=\"10\"/>\n  <text class=\"d-label-strong\" x=\"320\" y=\"44\" text-anchor=\"middle\">كود JavaScript</text>\n  <path class=\"d-arrow\" d=\"M285 62 L165 104\" marker-end=\"url(#arrow-l-js-1-1-1)\"/>\n  <path class=\"d-arrow\" d=\"M355 62 L475 104\" marker-end=\"url(#arrow-l-js-1-1-1)\"/>\n  <rect class=\"d-box\" x=\"30\" y=\"108\" width=\"270\" height=\"128\" rx=\"12\"/>\n  <text class=\"d-label-strong\" x=\"165\" y=\"132\" text-anchor=\"middle\">المتصفّح</text>\n  <rect class=\"d-box-accent\" x=\"105\" y=\"144\" width=\"120\" height=\"34\" rx=\"8\"/>\n  <text class=\"d-label\" x=\"165\" y=\"166\" text-anchor=\"middle\">محرّك JS</text>\n  <text class=\"d-label-muted\" x=\"165\" y=\"204\" text-anchor=\"middle\">+ الصفحة، الأحداث،</text>\n  <text class=\"d-label-muted\" x=\"165\" y=\"224\" text-anchor=\"middle\">fetch، localStorage</text>\n  <rect class=\"d-box\" x=\"340\" y=\"108\" width=\"270\" height=\"128\" rx=\"12\"/>\n  <text class=\"d-label-strong\" x=\"475\" y=\"132\" text-anchor=\"middle\">Node.js</text>\n  <rect class=\"d-box-accent\" x=\"415\" y=\"144\" width=\"120\" height=\"34\" rx=\"8\"/>\n  <text class=\"d-label\" x=\"475\" y=\"166\" text-anchor=\"middle\">محرّك JS</text>\n  <text class=\"d-label-muted\" x=\"475\" y=\"204\" text-anchor=\"middle\">+ الملفات، الخوادم،</text>\n  <text class=\"d-label-muted\" x=\"475\" y=\"224\" text-anchor=\"middle\">سطر الأوامر</text>\n</svg><figcaption>اللغة نفسها تعمل في بيئتين مضيفتين لكل منهما إضافاتها</figcaption></figure>\n<p>لهذا التقسيم أهمية من اليوم الأول. كل ما في الأقسام من 1 إلى 3 من هذه الدورة هو اللغة نفسها، لذلك يعمل في البيئتين. أما القسم 4 فيستخدم إضافات المتصفّح، فلا يعمل كوده إلا داخل صفحة ويب.</p>\n<h2 id=\"sec-2\" tabindex=\"-1\">أول سطر كود لك</h2>\n<p>هذا برنامج JavaScript كامل. اضغط زر التشغيل (Run).</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:#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\">\"Pocket is running\"</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:#0550AE;--shiki-dark:#79C0FF\">450</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> +</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 1200</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">);</span></span></code></pre><div class=\"run-output\" data-run-output=\"0\" hidden></div></div>\n<p>حدث شيئان، بالترتيب. أولًا قرأ المحرّك السطر 1، فوجد تعليمةً تطلب طباعة نصّ، فطبعه. ثم قرأ السطر 2، فحسب <code dir=\"ltr\">450 + 1200</code>، وطبع الناتج <code dir=\"ltr\">1650</code>. كل سطر من هذين السطرين <strong>تعليمة</strong> (statement)، أي أمر واحد، وتنتهي عادةً بفاصلة منقوطة. ينفّذ المحرّك التعليمات من الأعلى إلى الأسفل، واحدة تلو الأخرى، ولا يبدأ تعليمة قبل أن ينهي التي قبلها.</p>\n<p><code dir=\"ltr\">console.log()</code> هي نافذتك إلى داخل برنامجك. ستستخدمها باستمرار، وكذلك يفعل المطوّرون المحترفون. كل ما بين القوسين يُحسب أولًا، ثم يُطبع الناتج.</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>ثلاثة أماكن لتشغيل JavaScript</span></p>\n<ol>\n<li>أزرار التشغيل والتمارين في هذه الدورة، وهي تعمل في متصفّحك دون تثبيت أي شيء.</li>\n<li>الـ console في متصفّحك: افتح أي صفحة، واضغط Cmd+Option+J على Mac أو Ctrl+Shift+J على Windows في Chrome، واكتب <code dir=\"ltr\">1 + 1</code> ثم اضغط Enter.</li>\n<li>Node.js على حاسوبك: ثبّت إصدار LTS الحالي من nodejs.org، واحفظ الكود في ملف <code dir=\"ltr\">hello.js</code>، ثم شغّل <code dir=\"ltr\">node hello.js</code> في الطرفية (terminal).</li>\n</ol>\n</aside>\n<h2 id=\"sec-3\" tabindex=\"-1\">ما الذي ستبنيه: Pocket</h2>\n<p>ستبني طوال هذه الدورة برنامجًا واحدًا، قطعةً بعد قطعة: <strong>Pocket</strong>، وهو متتبّع للمصاريف. في الدروس القادمة سيكون مجرّد بضعة متغيّرات تُطبع في الـ console. وبحلول القسم 3 سيحمل قائمة مصاريف، ويجمعها حسب الفئة، ويرتّبها. وفي القسم 4 يصبح صفحة ويب فيها نموذج إدخال وقائمة حيّة وبيانات محفوظة. وفي القسم 5 تنظّمه كما تُنظَّم المشاريع الحقيقية، بالوحدات (modules) والأصناف (classes) ومعالجة سليمة للأخطاء.</p>\n<p>ينتهي معظم الدروس بتمرين. تكتب الكود في المحرّر، وتضغط زر التحقّق (Check)، فتخبرك مجموعة من الفحوص الآلية بما يعمل وما لم يعمل بعد. أن تخطئ في أحد الفحوص أمر طبيعي ومفيد: اقرأ الرسالة، وغيّر شيئًا واحدًا، ثم حاول مجددًا. هذه الحلقة من الكتابة ثم التشغيل ثم القراءة ثم الإصلاح هي ما تبدو عليه البرمجة كل يوم.</p>\n<p>في الدرس التالي تتعرّف إلى المادة الخام التي يعمل بها كل برنامج: القيم، وأنواعها، والمتغيّرات التي تحملها.</p>\n","toc":[{"id":"sec-1","text":"لغة واحدة وبيتان","level":2},{"id":"sec-2","text":"أول سطر كود لك","level":2},{"id":"sec-3","text":"ما الذي ستبنيه: Pocket","level":2}],"takeaways":["JavaScript لغة برمجة يستطيع كل متصفّح ويب تشغيلها، وNode.js يشغّل اللغة نفسها خارج المتصفّح.","اللغة نفسها صغيرة؛ أما البيئة المضيفة التي تعمل فيها (المتصفّح أو Node.js) فتضيف إمكانات أخرى مثل الصفحة أو الملفات أو الشبكة.","يُنفَّذ الكود تعليمةً تلو الأخرى، من الأعلى إلى الأسفل، ما لم تطلب منه غير ذلك.","<code dir=\"ltr\">console.log()</code> تطبع قيمة كي ترى ما يفعله برنامجك؛ وهي أول أداة تلجأ إليها في تصحيح الأخطاء (debugging)."],"further":[{"title":"What is JavaScript? (MDN)","url":"https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/Scripting/What_is_JavaScript"},{"title":"Introduction to Node.js","url":"https://nodejs.org/en/learn/getting-started/introduction-to-nodejs"},{"title":"console.log() (MDN)","url":"https://developer.mozilla.org/en-US/docs/Web/API/console/log_static"}],"quiz":[{"q":"<p>تكتب <code dir=\"ltr\">console.log(2 + 3)</code> في السطر 1 و<code dir=\"ltr\">console.log(&quot;done&quot;)</code> في السطر 2. ماذا يظهر في الـ console، وبأي ترتيب؟</p>","options":[{"text":"<code dir=\"ltr\">5</code> ثم <code dir=\"ltr\">done</code>، لأن التعليمات تُنفَّذ من الأعلى إلى الأسفل.","why":"صحيح. تُحسب التعليمة الأولى وتُطبع، ثم الثانية."},{"text":"<code dir=\"ltr\">done</code> ثم <code dir=\"ltr\">5</code>، لأن النص يُطبع قبل الأرقام.","why":"لا تجمّع JavaScript المخرجات حسب نوعها. التعليمات تُنفَّذ بالترتيب الذي كُتبت به."},{"text":"<code dir=\"ltr\">2 + 3</code> ثم <code dir=\"ltr\">done</code>، لأن <code dir=\"ltr\">console.log</code> تطبع ما كتبته حرفيًا.","why":"يُحسب التعبير <code dir=\"ltr\">2 + 3</code> أولًا، فتستلم <code dir=\"ltr\">console.log</code> الرقم 5، لا الحروف التي كتبتها."}],"answer":0},{"q":"<p>أيّ مما يلي يضيفه المتصفّح، وليس جزءًا من لغة JavaScript نفسها؟</p>","options":[{"text":"الأرقام والعامل <code dir=\"ltr\">+</code>.","why":"الأرقام والعوامل جزء من اللغة، لذلك تعمل بالطريقة نفسها في Node.js وفي كل متصفّح."},{"text":"التعليمة <code dir=\"ltr\">if</code>.","why":"أدوات التحكّم في سير البرنامج مثل <code dir=\"ltr\">if</code> جزء أساسي من قواعد اللغة، وموجودة في كل بيئة مضيفة."},{"text":"الكائن <code dir=\"ltr\">document</code> الذي يتيح لك تغيير الصفحة.","why":"صحيح. <code dir=\"ltr\">document</code> واجهة برمجية (API) يوفّرها المتصفّح. لا توجد صفحة في Node.js، لذلك لا يوجد فيه <code dir=\"ltr\">document</code>."}],"answer":2},{"q":"<p>يقول لك صديق: “JavaScript نسخة مبسّطة من Java”. ما الردّ الأدق؟</p>","options":[{"text":"هما لغتان لا علاقة بينهما، تشتركان في جزء من الاسم لأسباب تسويقية عام 1995.","why":"صحيح. سُمّيت JavaScript بهذا الاسم لتستفيد من شهرة Java في ذلك الوقت. واللغتان تعملان بطريقتين مختلفتين تمامًا."},{"text":"JavaScript هي نسخة المتصفّح من Java، وتُترجَم إلى الـ bytecode نفسه.","why":"لا تُترجَم JavaScript إلى bytecode خاص بـ Java، ولها معيارها الخاص، ECMAScript."},{"text":"JavaScript لغة أقدم حلّت Java محلّها لاحقًا على الويب.","why":"الـ applets المكتوبة بـ Java اختفت من الويب؛ وJavaScript هي اللغة التي يشغّلها كل متصفّح اليوم."}],"answer":0}],"exercise":{"kind":"web","mode":"js","starter":{"js":"// 1. Log the text: Welcome to Pocket\n// 2. Log the result of adding three expenses: 450, 1200 and 899\n"},"solution":{"js":"console.log(\"Welcome to Pocket\");\nconsole.log(450 + 1200 + 899);\n"},"checks":[{"id":"logs-welcome","test":"return logs.some((l) => l.toLowerCase().includes('welcome to pocket'));"},{"id":"logs-total","test":"return logs.some((l) => l.trim() === '2549');"},{"id":"welcome-first","test":"const w = logs.findIndex((l) => l.toLowerCase().includes('welcome to pocket'));\nconst t = logs.findIndex((l) => l.trim() === '2549');\nreturn w !== -1 && t !== -1 && w < t;\n"}],"title":"رحّب بـ Pocket","prompt":"<p>اكتب برنامجًا من سطرين. أولًا اطبع النص <code dir=\"ltr\">Welcome to Pocket</code>. ثم اطبع مجموع ثلاثة مصاريف، <code dir=\"ltr\">450</code> و<code dir=\"ltr\">1200</code> و<code dir=\"ltr\">899</code>، واترك JavaScript تُجري عملية الجمع داخل <code dir=\"ltr\">console.log()</code>.</p>\n","hints":["النص يوضع بين علامتي تنصيص، <code dir=\"ltr\">&quot;هكذا&quot;</code>. أما الأرقام فلا تحتاج إلى علامات تنصيص.","يمكنك وضع عملية حسابية كاملة داخل القوسين، مثل <code dir=\"ltr\">console.log(1 + 2)</code>.","<code dir=\"ltr\">console.log(450 + 1200 + 899);</code> تطبع المجموع."],"explanation":"<p>ينفّذ المحرّك تعليمتيك بالترتيب. في الأولى، <code dir=\"ltr\">&quot;Welcome to Pocket&quot;</code> نصّ، فيُطبع كما هو. وفي الثانية، تحسب JavaScript التعبير <code dir=\"ltr\">450 + 1200 + 899</code> أولًا، فتحصل على <code dir=\"ltr\">2549</code>، وبعدها فقط تسلّم هذا الرقم الواحد إلى <code dir=\"ltr\">console.log()</code>. قاعدة “احسب ما داخل القوسين قبل استخدامه” ستعتمد عليها في كل درس.</p>\n","checkLabels":{"logs-welcome":"تطبع “Welcome to Pocket”","logs-total":"تطبع المجموع 2549","welcome-first":"تطبع الترحيب قبل المجموع"}},"words":517,"readMinutes":3}