🚀 מבוא וחיבור לדף

JavaScript (בקיצור JS) היא שפת התכנות שמאפשרת להוסיף אינטראקטיביות, לוגיקה ודינמיות לדפי אינטרנט. בעוד HTML הוא השלד ו-CSS הוא העיצוב, JS הוא המוח.

איך מוסיפים JS לדף HTML?

1. קובץ חיצוני (השיטה המומלצת)

יוצרים קובץ נפרד (למשל script.js) ומקשרים אליו מה-HTML, רצוי לפני תג סגירת ה-</body>.

<body>
    <!-- ... כל תוכן ה-HTML ... -->

    <script src="script.js" defer></script>
</body>

המאפיין defer גורם לסקריפט להיטען במקביל ל-HTML ולהידחות הרצתו עד שה-HTML נטען במלואו, וזה מומלץ לביצועים.

2. קוד פנימי (Internal Script)

ניתן לכתוב JS ישירות בתוך תג <script>, גם כן רצוי בסוף ה-<body>.

<body>
    <!-- ... כל תוכן ה-HTML ... -->

    <script>
        console.log('שלום עולם!');
    </script>
</body>

הכירו את ה"קונסול החי"

ברוב הדוגמאות הבאות, החלון הימני אינו מציג דף אינטרנט, אלא מדמה את ה-Console של הדפדפן. כל פקודת console.log() שתכתבו בקוד תודפס שם, וכן שגיאות שיתרחשו.

📦 יסודות: משתנים וטיפוסים

בניגוד ל-Java, ג'אווהסקריפט היא שפת טיפוסים דינמית (Dynamically Typed). אין צורך להכריז על int או String. המנוע מבין את הטיפוס בזמן ריצה.

let, const, ו-var

  • const: הדרך המועדפת. מגדיר קבוע שלא ניתן להקצות מחדש. Block Scoped. (אם הקבוע הוא אובייקט או מערך, ניתן לשנות את תוכנם הפנימי).
  • let: להגדרת משתנה שערכו עשוי להשתנות. גם הוא Block Scoped.
  • var: הדרך הישנה. Function Scoped. מומלץ להימנע משימוש בה בקוד מודרני בגלל התנהגות מבלבלת עם Hoisting.

טיפוסים פרימיטיביים

טיפוסדוגמההערה (מול Java)
Number10, 3.14אין הפרדה בין int, double, float. הכל Number.
String"שלום", 'עולם', `כאן ${name}`מחרוזת. ניתן להשתמש ב-` להטמעת משתנים.
Booleantrue, falseזהה ל-Java.
nullnullערך "ריק" מכוון. (typeof null מחזיר 'object', באג היסטורי).
undefinedundefinedטיפוס של משתנה שטרם הוקצה לו ערך. (ייחודי ל-JS)
SymbolSymbol('id')מזהה ייחודי ובלתי ניתן לשינוי.
BigInt100nלמספרים שלמים גדולים מאוד.

קונסול חי: משתנים וטיפוסים

⚙️ אופרטורים

אופרטורים מאפשרים לבצע פעולות, השוואות והקצאות. רובם דומים ל-Java, אך יש כמה תוספות חשובות.

סוגי אופרטורים
סוגאופרטוריםתיאור
חשבון+, -, *, /, %, **פעולות מתמטיות.
הקצאה=, +=, -=, *=, /=הקצאת ערכים למשתנים.
השוואה==, !=, ===, !==, >, <, >=, <=השוואת ערכים. מומלץ תמיד להשתמש ב-=== (השוואה קפדנית).
לוגיים&&, ||, !צירוף תנאים בוליאניים.
טרנריcondition ? val1 : val2קיצור של if...else.
Nullish Coalescing??מחזיר את הערך הימני רק אם הערך השמאלי הוא null או undefined.
Optional Chaining?.גישה בטוחה למאפיינים מקוננים – מחזיר undefined במקום לזרוק שגיאה.

קונסול חי: אופרטורים מודרניים

🚦 בקרת זרימה

הלוגיקה הבסיסית של תנאים ולולאות. דומה ל-Java, עם תוספות כמו for...of ו-for...in.

פונקציות

פונקציות הן אבני הבניין של הלוגיקה ב-JS. ניתן להגדיר אותן בכמה דרכים, והן יכולות לקבל פונקציות אחרות כארגומנטים (Higher-Order Functions).

🔬 Scope & Closures

סקופ קובע את הנראות של משתנים. Closure (סגור) הוא פונקציה ש"זוכרת" את הסביבה הלוקאלית שבה היא נוצרה.

  • Global Scope: משתנה שמוגדר מחוץ לכל פונקציה. זמין בכל מקום.
  • Function Scope: משתנה שמוגדר עם var זמין בכל הפונקציה שבה הוגדר.
  • Block Scope: משתנה שמוגדר עם let או const זמין רק בתוך הבלוק ({...}).

מערכים ומתודות

מערכים ב-JS גמישים מאוד - דינמיים ועשירים במתודות פונקציונליות.

אובייקטים ומתודות

אובייקטים ב-JS הם אוספים דינמיים של מפתח-ערך.

מתודות מובנות (String, Number, Math)

מבני נתונים (Set, Map)

  • Set: אוסף של ערכים ייחודיים. מצוין להסרת כפילויות ממערך.
  • Map: אוסף של מפתח-ערך. המפתחות יכולים להיות מכל טיפוס (כולל אובייקטים או פונקציות).

🏛️ Classes ו-Prototype

בניגוד ל-Java שהיא Class-Based, ג'אווהסקריפט היא Prototypal. תחביר ה-class הוא "סוכר תחבירי" מעל מנגנון הפרוטוטייפ.

הדרך הישנה: Constructor Function ו-Prototype

function Person(name, age) {
  this.name = name;
  this.age = age;
}
Person.prototype.greet = function() {
  console.log(`שלום, אני ${this.name} ואני בן ${this.age}.`);
};
const p1 = new Person("משה", 50);
p1.greet();

קונסול חי: class, extends, super

הקונספט 'this'

הערך של this נקבע בזמן הריצה, בהתאם לאיך הפונקציה נקראה.

4 כללי this
  1. Default (Global): אם פונקציה נקראת רגיל, this יצביע על window (או undefined ב-Strict Mode).
  2. Implicit (Method): אם פונקציה נקראת כמתודה (obj.method()), this יצביע על obj.
  3. New (Constructor): אם פונקציה נקראת עם new, this יצביע על האובייקט החדש.
  4. Explicit: ניתן לכפות את הערך עם .call(), .apply(), או .bind().

חריג: לפונקציות חץ אין this משלהן. הן יורשות את this לקסיקלית מה-Scope שבו הוגדרו.

🌳 מניפולציית DOM ואירועים

ה-DOM (Document Object Model) הוא ה-API שמאפשר ל-JS לתקשר עם ה-HTML.

שיטות נפוצות
שיטהתיאור
document.getElementById(id)מוצא אלמנט לפי ה-ID.
document.querySelector(selector)מוצא את האלמנט הראשון שתואם ל-CSS selector.
document.querySelectorAll(selector)מוצא את כל האלמנטים שתואמים.
element.textContentקורא/משנה את הטקסט הפנימי (בטוח).
element.innerHTMLקורא/משנה את ה-HTML הפנימי (פחות בטוח).
element.style.color = 'red'משנה מאפיין CSS.
element.classList.add('new')מוסיף קלאס.
element.addEventListener(event, fn)מאזין לאירוע.
document.createElement('div')יוצר אלמנט חדש.
parent.append(child)מוסיף ילד.

מעבדת DOM אינטראקטיבית

יש לכם עורך HTML ועורך JS. כתבו JS שמשנה את ה-HTML וראו את התוצאה.

⚡ אסינכרוניות (Async)

JS פועלת ב-Single Thread עם Event Loop. היא לא "נתקעת" ומחכה לפעולות ארוכות.

מכניקת ה-Event Loop
  1. Call Stack: קוד סינכרוני נכנס לכאן ומבוצע (LIFO).
  2. Web APIs: פעולות ארוכות (setTimeout, fetch) נשלחות לכאן.
  3. Callback Queue: כשפעולת Web API מסתיימת, ה-Callback שלה נכנס לתור (FIFO).
  4. Event Loop: אם ה-Call Stack ריק, היא לוקחת את המשימה הראשונה מהתור.

Microtask Queue: תור נוסף עם עדיפות גבוהה (למשל, .then()) - מתרוקן לפני ה-Callback Queue הרגיל.

קונסול חי: setTimeout, Promise, fetch

Async/Await

טיפול בשגיאות

קוד מקצועי חייב לדעת לטפל בשגיאות בחן, באמצעות try...catch...finally.

JSON

פורמט טקסטואלי סטנדרטי להעברת נתונים.

LocalStorage

מנגנון אחסון פשוט בדפדפן ששומר נתונים (כמחרוזות) באופן קבוע.

הדוגמה תכתוב ל-LocalStorage האמיתי של הדפדפן. F12 → Application → Local Storage כדי לראות.

📦 מודולים

הדרך המודרנית (ES6) לארגן קוד בקבצים נפרדים: קובץ מייצא (export) וקובץ אחר מייבא (import).

לא ניתן להדגים import/export בעורך החי, כיוון שהם דורשים מערכת קבצים אמיתית.

קובץ math.js (ייצוא)
// Named Export
export const PI = 3.14;
export function add(a, b) { return a + b; }

// Default Export
export default function multiply(a, b) { return a * b; }
קובץ main.js (ייבוא)
import multiply, { add, PI } from './math.js';

console.log(PI);          // 3.14
console.log(add(2, 3));   // 5
console.log(multiply(2, 3)); // 6

// ב-HTML:
// <script type="module" src="main.js"></script>

ביטויים רגולריים (Regex)

תחביר מיוחד לחיפוש והחלפת תבניות בתוך מחרוזות.

🌐 Single Page Applications (SPA)

אפליקציית עמוד-יחיד טוענת דף HTML יחיד וכל התוכן העתידי נטען באופן דינמי, ללא טעינה מחדש.

איך זה עובד?

במקום לבקש דף HTML חדש בכל ניווט, ה-SPA משתמש ב-JS כדי לשנות את תוכן ה-DOM. השרת מספק רק נתונים (JSON), והלקוח אחראי על הרינדור.

יתרונות

  • מהירות: מעברים בין "עמודים" מיידיים.
  • חווית משתמש: חוויה רציפה ללא הבהובי טעינה.
  • פחות עומס על השרת: פחות מידע ברשת.

חסרונות

  • טעינה ראשונית איטית: טוענים את כל הקוד מראש.
  • אתגרי SEO: תוכן דינמי קשה יותר לאינדוקס.
  • תלות ב-JS: אם JS מושבת, האתר לא יעבוד.

פריימוורקים פופולריים

  • React - ספרייה פופולרית מבית פייסבוק.
  • Angular - פריימוורק מקיף מבית גוגל.
  • Vue.js - פריימוורק גמיש שקל ללמוד.

מעבדת DOM: דוגמת SPA בסיסית