الجافا سكريبت (تُختصر بـ JS) هي لغة برمجة عالية المستوى، وهي العصب الأساسي لشبكة الويب الحديثة. هي اللغة التي تعطي "الحياة" لصفحات الويب وتجعلها تتفاعل معك.
تخيل أن موقع الويب هو "منزل":
وظيفتها الأساسية: تحويل الموقع من مجرد نصوص ثابتة إلى موقع تفاعلي.
تعمل غالباً داخل المتصفح (Client-side). المتصفح يحتوي على "محرك" (Engine) يقرأ الكود سطراً بسطر وينفذ الأوامر فوراً.
هناك 3 طرق لكتابة الكود:
<script>
alert("مرحباً بك!");
</script>
يتم إنشاء ملف بامتداد .js وربطه بالصفحة:
<script src="main.js"></script>
للتجربة السريعة داخل المتصفح.
| العنصر | الوظيفة | التشبيه |
|---|---|---|
| HTML | الهيكل والمحتوى | العظام |
| CSS | الشكل والمظهر | الملابس |
| JS | التفاعل والمنطق | العقل والأعصاب |
🎉 ممتاز! لقد قمت بتشغيل كود JavaScript بنجاح!
في الدرس ده هنتعلم إزاي نخلي JavaScript تخرج لنا بيانات، وإزاي نكتب ملاحظات جوه الكود.
عندنا طرق كتير، وأهمهم اللي هنستخدمهم طول الرحلة دي:
دي أهم أداة للمبرمج، بتطبع النتائج في كونسول المتصفح (اضغط F12 عشان تشوفها).
console.log("أهلاً بك في عالم البرمجة");
بنستخدمها لما نحب نغير محتوى عنصر موجود فعلاً في صفحة الـ HTML.
document.getElementById("text").innerHTML = "تم التغيير!";
التعليقات هي نصوص بيكتبها المبرمج لنفسه والمحرك بيتجاهلها تماماً.
// تعليق سطر واحد (Single Line)
/* تعليق أكثر من سطر
(Multi-line Comment)
*/
هناك 3 طرق شهيرة لإخراج البيانات، لكن لكل واحدة هدف ومكان استخدام مختلف تماماً.
تستخدم لطباعة القيم في الـ Console (اضغط F12) للفهم والتصحيح. المستخدم لا يراها!
console.log("Age:", 20); // مخرجات للمبرمج فقط
تظهر للمستخدم وتوقف الصفحة بالكامل. ❌ لا تُستخدم في المواقع الاحترافية.
alert("أهلاً بك"); // توقف كل شيء حتى تضغط OK
تكتب مباشرة في الصفحة، لكنها قد تمسح المحتوى بالكامل إذا استُخدمت بشكل خاطئ.
document.write("Hello"); // تمسح الصفحة في المواقع الحديثة
document.write() و
alert() ممنوعة في المشاريع الحقيقية. البديل هو الـ
Console للمبرمج والـ
Notifications للمستخدم.
| الخاصية | console.log | alert | document.write |
|---|---|---|---|
| تظهر لمين؟ | المبرمج | المستخدم | المستخدم |
| بتوقف الصفحة؟ | ❌ | ✅ | ❌ |
| احترافية؟ | ✅ آمنة | ❌ مزعجة | ❌ ممنوعة |
في هذا الدرس سنتعلم كيف نفكر كمبرمجين: كيف نخزن البيانات، أنواعها، وكيف نكتشف الأخطاء بسرعة.
الفرق بين المبرمج المحترف والمبتدئ هو سرعة اكتشاف الخطأ. صديقك الأول هو Console (F12).
خطأ في الكتابة (نسيت قوس، كتبت كلمة غلط).
بتنادي على متغير مش موجود أصلاً.
بتعامل رقم كأنه دالة (مثلاً).
console.log(variable) قبل وبعد السطر المشكوك فيه لمراقبة
القيم.
البيانات في JS لها أنواع، لازم تكون عارف إنت بتتعامل مع إيه.
| النوع | مثال | الوصف |
|---|---|---|
| String | "Ali" |
نص (بين علامات تنصيص) |
| Number | 20, 9.5 |
أرقام (بدون تنصيص) |
| Boolean | true |
يا صح يا غلط |
اضغط لمعرفة نوع البيانات الحقيقي:
let num = 4 + 5; //9
let num = 5 – 4; //1
let num = 4 * 5; //20
let num = 5 / 4; //1.25
let num = 5 % 2; //1
let num = 4 ** 5; //1024
المتغير هو "علبة" بنشيل فيها البيانات ولها اسم.
قيمة ثابتة لا تتغير.
const country = "Egypt";
قيمة ممكن تتغير عادي.
let age = 20;
❌ به مشاكل، لا تستخدمه.
كيف نركب جملة فيها متغيرات؟
"My name is " + name + " age " + age
`My name is ${name} age ${age}`
تخيّل واحد واقف على طريق، وعنده قرار:
🌧️ لو الجو مطر ← خُد شمسية
❄️ غير كده لو الجو برد ← إلبس جاكيت
☀️ غير كده ← إطلع عادي
ده بالظبط اللي بتعمله if / else if / else.
يعني إيه if؟ يعني: لو الشرط صح ← نفّذ الكود
الشكل العام:
if (condition) { // الكود اللي هيتنفّذ }
condition لازم تكون: true أو false
مثال بسيط جدًا:
let age = 20;
if (age >= 18) {
console.log("أنت بالغ");
}
✔️ لو age = 20 ← الشرط صح ← الكود يتنفّذ
❌ لو age = 15 ← الشرط غلط ← الكود يتجاهل
❗ ملاحظة مهمة: if ملهاش else، يعني لو الشرط غلط مفيش حاجة تحصل.
يعني إيه؟ لو الشرط صح ← نفّذ كذا | غير كده ← نفّذ حاجة تانية
if (condition) { // لو صح } else { // لو غلط }
مثال واضح:
let temperature = 30;
if (temperature > 25) {
console.log("الجو حر");
} else {
console.log("الجو مش حر");
}
الحقيقة المهمة: else ملهاش شرط، بتتنفّذ لما if تكون غلط.
ليه نحتاجها؟ لما يكون عندك أكتر من احتمال.
مثال حياتي (التقديرات):
let score = 85;
if (score >= 90) { console.log("ممتاز"); }
else if (score >= 75) { console.log("جيد جدًا"); }
else if (score >= 60) { console.log("جيد"); }
else { console.log("راسب"); }
🔴 مهم جدًا: JavaScript بتشيّك من فوق لتحت، وأول شرط يطلع true يقف.
مثال: if (age >= 18 && isStudent) { ... }
القيم اللي بتعتبر False هي: false, 0, "", null, undefined, NaN
أي حاجة غير كده = True
تسجيل دخول - زر مفعّل - التحقق من إدخال الإيميل.
const age = 17;
if (age >= 18) { console.log("مسموح"); }
else { console.log("ممنوع"); }
if = لو | else if = احتمال تاني | else = غير كده
الترتيب مهم جدًا.. أول شرط صح يقف.
اقرأ الكود ده كويس، وتوقع الرقم اللي هيطلع في الـ console:
let totalOrder = 100;
let isVip = true;
let discount = 0;
if (totalOrder > 150) {
discount = 20;
}
else if (isVip === true) {
discount = 10;
}
else {
discount = 0;
}
console.log(discount);
تفتكر قيمة الـ discount هتكون كام؟
تخيّل عندك زرار:
🔘 لو ضغط 1 ← يطلع رسالة
🔘 لو ضغط 2 ← يطلع رسالة تانية
🔘 لو ضغط 3 ← رسالة تالتة
جملة switch هي أداة تحكم بديلة أكثر ترتيباً لسلسلة طويلة من if...else if عندما تقارن متغيراً واحداً بقيم ثابتة.
تقوم الـ switch بتقييم التعبير مرة واحدة، ثم تقارن الناتج مع قيم case.
switch (expression) {
case value1:
// كود الحالة الأولى
break; // يوقف التنفيذ ويخرج
case value2:
// كود الحالة الثانية
break;
default:
// لو مفيش أي حاجة طابقت (مثل else)
}
لنفترض أننا نحدد الإجراء بناءً على اللون:
let trafficLight = "red";
switch (trafficLight) {
case "green": console.log("انطلق"); break;
case "yellow": console.log("استعد"); break;
case "red": console.log("توقف"); break;
default: console.log("إشارة معطلة");
}
يمكنك دمج أكثر من case لتنفيذ نفس الكود (مفيد لعدم التكرار).
مثال: هل اليوم عطلة أم عمل؟
case "Friday":
case "Saturday":
console.log("إجازة 🎉"); break;
الصحيح عند تعريف متغيرات:
case 1: {
let y = 10;
break;
}
لا تعتمد على تحويل الأنواع التلقائي كما يحدث أحياناً في ==. الـ switch تستخدم ===.
let num = "5"; // نص
switch (num) {
case 5: // رقم
console.log("هذا رقم 5");
break;
case "5": // نص
console.log("هذا نص 5");
break;
}
// الناتج: هذا نص 5 (لأنه تطابق تام)
// لن يتم تنفيذ الحالة الأولى لأن الأنواع مختلفة.
✅ default: اختيارية، ويفضل وضعها للقيم غير المتوقعة.
✅ السرعة: قد تكون أسرع قليلاً من if..else في المقارنات الكثيرة.
لو المتغير rank قيمته هي النص "2"، تفتكر إيه اللي هيطلع؟
let rank = "2";
switch(rank) {
case 2:
console.log("فضي");
break;
case "2":
console.log("ذهبي");
break;
default:
console.log("مفيش مركز");
}
اكتب الكلمة اللي هتطلع في الـ console (فضي، ذهبي، مفيش مركز):
for معناها ببساطة:
كرر نفس الكود أكتر من مرة بدل ما تكتبه بإيدك
في JavaScript عندنا أكثر من نوع للحلقة for:
+2
سيتم شرح كل نوع بالتفصيل في المستقبل ولاكن الان سنشرح for التقليدية
for (initialization; condition; increment) {
// الكود اللي هيتكرر
}
دلوقتي نفهم كل جزء لوحده 👇
let i = 0;
ده عداد بيبدأ من قيمة معينة بيتنفّذ مرة واحدة فقط
i < 5;
طول ما الشرط true الـ Loop تكمل أول ما يبقى false → توقف
i++;
بيزوّد العداد بعد كل دورة ممكن: يزيد، ينقص، يزيد بأكتر من 1
for (let i = 1; i <= 5; i++) {
console.log(i);
}
إيه اللي حصل خطوة خطوة؟
1️⃣ i = 1 | ,2️⃣ 1 <= 5 → صح | 3️⃣ اطبع 1 | 4️⃣ i++ → بقت 2 | 5️⃣ كرر…
البداية ← الشرط ← تنفيذ الكود ← الزيادة ← الرجوع للشرط
🔹 مثال 1: طباعة من 0 لـ 9
for (let i = 0; i < 10; i++)
{ console.log(i); } //0 1 2 3 4 5 6 7 8 9
🔹 مثال 2: العد التنازلي
for (let i = 10; i >= 1; i--)
{ console.log(i); } //10 9 8 7 6 5 4 3 2 1
🔹 مثال 3: الزيادة بأكتر من 1
for (let i = 0; i <= 10; i += 2)
{ console.log(i); } //0 2 4 6 8 10
🔹 مثال 4: التكرار على Array
let names = ["Ali", "Eslam", "Ahmed"];
for (let i = 0; i < names.length; i++) {
console.log(names[i]);
} // Ali Eslam Ahmed
const colors = ["red", "green", "blue"];
for (let i = 0; i < colors.length; i++) {
console.log(colors[i]);
} // red green blue
هذا نمط كلاسيكي وشائع جداً: نستخدم i كـ index للوصول لكل عنصر: colors[i].
const name = "Ali";
for (let i = 0; i < name.length; i++) {
console.log(name[i]);
} //A l i
النص في JS أيضاً iterable، فنستطيع استخدامه مثل المصفوفة
const arr = [10, 20, 30, 40, 50];
for (let i = arr.length - 1; i >= 0; i--) {
console.log(arr[i]);
} // 50 40 30 20 10
نبدأ من آخر index: arr.length - 1. الشرط i >= 0 وننقص i في كل مرة: i--.
مثال: حلقة لا تملك initialization (العداد معرّف من قبل):
let i = 0;
for (; i < 3; i++)
{ console.log(i); }
مثال: حلقة لا تملك condition (حلقة لا نهائية تحتاج break):
let i = 0;
for (;;)
{ console.log(i); i++; if (i >= 3) break; }
for (let i = 1; i <= 10; i++)
{ if (i % 2 === 0)
{ console.log(i + " عدد زوجي"); }
}
🔸 break (إيقاف الـ Loop)
for (let i = 1; i <= 10; i++)
{ if (i === 5)
{ break; }
console.log(i);
}
⛔ الـ Loop تقف عند 5
🔸 continue (تخطي دورة)
for (let i = 1; i <= 5; i++)
{ if (i === 3)
{ continue; }
console.log(i);
}
⏭️ يتخطى 3
for (let i = 1; i <= 3; i++)
{ for (let j = 1; j <= 2; j++)
{ console.log(i, j); }
} // 1 1 1 2 2 1 2 2 3 1 3 2
تستخدم في: الجداول، الشبكات، الألعاب
1️⃣ نسيان الزيادة (Infinite Loop): ❌ الـ Loop هتفضل شغالة للأبد | ✔️ الحل: i++
2️⃣ شرط غلط: ❌ الشرط false من البداية → مش هيطبع حاجة
3️⃣ استخدام var بدل let: ❌ ممكن يعمل مشاكل | ✔️ استخدم let
4️⃣ نسيان length مع Array: ❌ غلط | ✔️ الصح: i < arr.length
for = تكرار
3 أجزاء: بداية – شرط – زيادة
تستخدم لما تعرف عدد التكرارات
break توقف |
continue تخطي
⚠ انتبه للـ Infinite Loop
اقرأ الكود التالي بتركيز، وحاول معرفة القيمة النهائية للمتغير
total:
let numbers = [1, 2, 3, 4, 5];
let total = 0;
for (let i = 0; i < numbers.length; i++) {
if (numbers[i] % 2 === 0) {
continue; // تخطي الأرقام الزوجية
}
total += numbers[i];
}
console.log(total);
ما هي قيمة total النهائية؟
أهلاً بك مجدداً! بعد أن أتقنت الـ for، حان الوقت لفهم "أبناء العمومة" في عائلة التكرار: while و do...while.
الفرق الجوهري بينهما وبين for هو أننا نستخدم for عندما نعرف عدد مرات التكرار (مثل: كرر 10 مرات).
أما while و do...while نستخدمهما عندما لا نعرف متى سنتوقف، ويعتمد الأمر على شرط معين (مثل: استمر في اللعب حتى يخسر اللاعب).
هذه الجملة تفكر قبل أن تعمل. هي تتحقق من الشرط أولاً، فإذا كان صحيحاً (true)، تنفذ الكود. إذا كان خاطئاً من البداية، لن تعمل أبداً.
while (condition) {
// الكود الذي سيتكرر
// خطوة تحديث (مهمة جداً لتجنب اللانهاية)
}
let i = 1;
while (i <= 5) {
console.log(i);
i++;
} // 1 2 3 4 5
let count = 5;
while (count > 0) {
console.log("العد: " + count);
count--; // نقصنا 1 (بدون هذا السطر سيعلق البرنامج للأبد)
} // العد : 5 العد : 4 العد : 3 العد : 2 العد : 1
تخيل أنك تريد توليد رقم عشوائي وتستمر في المحاولة حتى تحصل على الرقم 6. أنت لا تعرف هل سيحدث ذلك في المحاولة الأولى أم المئة.
let dice = 0;
// !== هل لا تساوي
while (dice !== 6) {
dice = Math.floor(Math.random() * 6) + 1; // رمي النرد (1-6)
console.log("حصلت على: " + dice);
}
console.log("أخيراً! ظهر الرقم 6.");
هذه الجملة تعمل أولاً ثم تفكر. هي تضمن تنفيذ الكود مرة واحدة على الأقل، ثم تتحقق من الشرط لترى إن كانت ستكرر أم لا.
do {
// الكود ينفذ هنا مرة واحدة حتماً
// خطوة التحديث
} while (condition); // لاحظ الفاصلة المنقوطة هنا ضرورية
أفضل مثال هو قوائم "جرب مرة أخرى". أنت تريد عرض القائمة للمستخدم مرة واحدة، ثم تسأله إن كان يريد الاستمرار.
let number = 0;
do {
// لنفترض أننا نزيد الرقم هنا
number += 5; // number = number + 5
console.log("الرقم الحالي: " + number);
} while (number < 20);
لنرى ماذا يحدث إذا كان الشرط خاطئاً من البداية (false).
let x = 100;
while (x < 10) {
console.log("أنا داخل while");
}
النتيجة: لن يطبع شيئاً أبداً.
let y = 100;
do {
console.log("أنا داخل do-while");
} while (y < 10);
النتيجة: سيطبع هذه الجملة مرة واحدة!
أ) نسيان تحديث المتغير (Infinite Loop): هذا أشهر خطأ. إذا لم تغير المتغير، سيظل الشرط true للأبد.
ب) وضع الفاصلة المنقوطة ; في المكان الخطأ: وضعها بعد while مباشرة ينهي الـ Loop فوراً ويجمد البرنامج.
ج) نسيان الفاصلة المنقوطة في نهاية do...while: هي مطلوبة في نهاية سطر while(condition);.
د) استخدام do...while عندما يجب التحقق أولاً: قد يسبب خطأ لو البيانات فارغة، استخدم while العادية.
let count = 0;
let x = 1;
while (x < 10) {
x += 3;
count++;
}
ما هي القيمة النهائية للمتغير count؟
let score = 10;
let attempts = 0;
do {
score -= 5;
attempts++;
} while (score > 10);
ما هي القيمة النهائية للمتغير attempts؟