🚀 מבוא וחיבור לדף
JavaScript (בקיצור JS) היא שפת התכנות שמאפשרת להוסיף אינטראקטיביות, לוגיקה ודינמיות לדפי אינטרנט. בעוד HTML הוא השלד ו-CSS הוא העיצוב, JS הוא המוח.
איך מוסיפים JS לדף HTML?
יוצרים קובץ נפרד (למשל script.js) ומקשרים אליו מה-HTML, רצוי לפני תג סגירת ה-</body>.
<body>
<!-- ... כל תוכן ה-HTML ... -->
<script src="script.js" defer></script>
</body>
המאפיין defer גורם לסקריפט להיטען במקביל ל-HTML ולהידחות הרצתו עד שה-HTML נטען במלואו, וזה מומלץ לביצועים.
ניתן לכתוב 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) |
|---|---|---|
Number | 10, 3.14 | אין הפרדה בין int, double, float. הכל Number. |
String | "שלום", 'עולם', `כאן ${name}` | מחרוזת. ניתן להשתמש ב-` להטמעת משתנים. |
Boolean | true, false | זהה ל-Java. |
null | null | ערך "ריק" מכוון. (typeof null מחזיר 'object', באג היסטורי). |
undefined | undefined | טיפוס של משתנה שטרם הוקצה לו ערך. (ייחודי ל-JS) |
Symbol | Symbol('id') | מזהה ייחודי ובלתי ניתן לשינוי. |
BigInt | 100n | למספרים שלמים גדולים מאוד. |
קונסול חי: משתנים וטיפוסים
⚙️ אופרטורים
אופרטורים מאפשרים לבצע פעולות, השוואות והקצאות. רובם דומים ל-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 נקבע בזמן הריצה, בהתאם לאיך הפונקציה נקראה.
- Default (Global): אם פונקציה נקראת רגיל,
thisיצביע עלwindow(אוundefinedב-Strict Mode). - Implicit (Method): אם פונקציה נקראת כמתודה (
obj.method()),thisיצביע עלobj. - New (Constructor): אם פונקציה נקראת עם
new,thisיצביע על האובייקט החדש. - 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. היא לא "נתקעת" ומחכה לפעולות ארוכות.
- Call Stack: קוד סינכרוני נכנס לכאן ומבוצע (LIFO).
- Web APIs: פעולות ארוכות (
setTimeout,fetch) נשלחות לכאן. - Callback Queue: כשפעולת Web API מסתיימת, ה-Callback שלה נכנס לתור (FIFO).
- 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 בעורך החי, כיוון שהם דורשים מערכת קבצים אמיתית.
// 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; }
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 - פריימוורק גמיש שקל ללמוד.