משתנים וטיפוסי נתונים

מה זה משתנה?

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

// יצירת משתנה בשם "age" עם הערך 25
let age = 25;

// קריאת הערך
console.log(age);  // 25

// שינוי הערך
age = 26;
console.log(age);  // 26

שלוש דרכים להכריז על משתנה

let - משתנה ניתן לשינוי

let name = "דן";
name = "דנה";      // ✅ מותר לשנות
console.log(name); // "דנה"

const - קבוע (לא ניתן לשינוי)

const PI = 3.14159;
PI = 3.14;         // ❌ שגיאה! אי אפשר לשנות const

const API_URL = "https://api.example.com";

var - הדרך הישנה (לא מומלץ)

var oldWay = "לא מומלץ להשתמש";
// var יש לו בעיות עם scope, עדיף let

ההבדלים בין let, const ו-var

תכונה let const var
שינוי ערך ✅ כן ❌ לא ✅ כן
Block scope ✅ כן ✅ כן ❌ לא
Hoisting ❌ לא זמין ❌ לא זמין ✅ זמין (undefined)
הכרזה מחדש ❌ לא ❌ לא ✅ כן

דוגמה ל-Block Scope

if (true) {
    let x = 10;
    var y = 20;
}

console.log(y);  // 20 - var נגיש מחוץ לבלוק
console.log(x);  // ❌ שגיאה! let לא נגיש מחוץ לבלוק

💡 כלל אצבע: השתמשו ב-const כברירת מחדל. השתמשו ב-let רק כשצריך לשנות את הערך.


כללים לשמות משתנים

מה מותר?

let name = "דן";           // ✅ אותיות
let age2 = 25;             // ✅ ספרות (לא בהתחלה)
let first_name = "דן";     // ✅ קו תחתון
let $price = 100;          // ✅ סימן דולר
let _private = "סודי";     // ✅ קו תחתון בהתחלה

מה אסור?

let 2name = "דן";          // ❌ מתחיל בספרה
let my-name = "דן";        // ❌ מקף
let my name = "דן";        // ❌ רווח
let for = "דן";            // ❌ מילה שמורה

מוסכמות שמות (Naming Conventions)

// camelCase - הכי נפוץ ב-JavaScript
let firstName = "דן";
let totalAmount = 100;
let isLoggedIn = true;

// SCREAMING_SNAKE_CASE - לקבועים
const MAX_SIZE = 100;
const API_KEY = "abc123";

// PascalCase - לclass וcomponents
class UserProfile { }
function UserCard() { }

טיפוסי נתונים פרימיטיביים (Primitives)

JavaScript מכילה 7 טיפוסים פרימיטיביים:

1. String - מחרוזת

let name = "דן";              // גרשיים כפולות
let city = 'תל אביב';         // גרש בודד
let greeting = `שלום ${name}`; // template literal

console.log(greeting);  // "שלום דן"

2. Number - מספר

let age = 25;           // מספר שלם
let price = 19.99;      // מספר עשרוני
let negative = -10;     // מספר שלילי
let big = 1000000;      // מספר גדול
let scientific = 2.5e6; // 2,500,000 (כתיב מדעי)

// ערכים מיוחדים
let infinity = Infinity;
let notANumber = NaN;   // Not a Number

3. Boolean - ערך אמת/שקר

let isActive = true;
let isLoggedIn = false;

// תוצאות של השוואות
let isAdult = age >= 18;     // true
let isEmpty = name === "";   // false

4. undefined - לא מוגדר

let x;
console.log(x);  // undefined

// משתנה שהוכרז אבל לא קיבל ערך
let user;
console.log(user);  // undefined

5. null - ריק במכוון

let user = null;  // אין משתמש כרגע

// ההבדל מ-undefined:
// undefined = לא הוגדר
// null = הוגדר במכוון כריק

6. Symbol - ייחודי

let id1 = Symbol("id");
let id2 = Symbol("id");

console.log(id1 === id2);  // false - כל Symbol ייחודי

7. BigInt - מספרים גדולים מאוד

let bigNumber = 9007199254740991n;
let anotherBig = BigInt("12345678901234567890");

typeof - בדיקת סוג

האופרטור typeof מחזיר את סוג המשתנה:

console.log(typeof "שלום");    // "string"
console.log(typeof 42);        // "number"
console.log(typeof true);      // "boolean"
console.log(typeof undefined); // "undefined"
console.log(typeof null);      // "object" (באג היסטורי!)
console.log(typeof {});        // "object"
console.log(typeof []);        // "object"
console.log(typeof function(){}); // "function"

המרות בין סוגים (Type Conversion)

המרה למחרוזת

let num = 42;
let str = String(num);      // "42"
let str2 = num.toString();  // "42"
let str3 = num + "";        // "42" (טריק)

המרה למספר

let str = "42";
let num = Number(str);      // 42
let num2 = parseInt(str);   // 42 (שלם)
let num3 = parseFloat("3.14"); // 3.14 (עשרוני)
let num4 = +str;            // 42 (טריק)

// מקרים מיוחדים
Number("abc");      // NaN
Number("");         // 0
Number(true);       // 1
Number(false);      // 0
Number(null);       // 0
Number(undefined);  // NaN

המרה לבוליאני

Boolean(1);         // true
Boolean(0);         // false
Boolean("שלום");    // true
Boolean("");        // false
Boolean(null);      // false
Boolean(undefined); // false

// ערכים שהם false (falsy):
// 0, "", null, undefined, NaN, false

// כל השאר הם true (truthy)

חיבור מחרוזות (String Concatenation)

let first = "שלום";
let last = "עולם";

// שיטה 1: אופרטור +
let full = first + " " + last;  // "שלום עולם"

// שיטה 2: Template Literals (מומלץ!)
let message = `${first} ${last}!`;  // "שלום עולם!"

// שימוש מתקדם ב-template literals
let name = "דן";
let age = 25;
let intro = `שמי ${name}.
אני בן ${age}.
בעוד 5 שנים אהיה בן ${age + 5}.`;

עבודה עם מחרוזות

let text = "שלום עולם";

// אורך
console.log(text.length);  // 9

// גישה לתו (0-indexed)
console.log(text[0]);      // "ש"
console.log(text.charAt(0)); // "ש"

// מציאת מיקום
console.log(text.indexOf("עולם")); // 5

// חיתוך
console.log(text.slice(0, 4));  // "שלום"
console.log(text.substring(5)); // "עולם"

// שינוי אותיות
let eng = "Hello";
console.log(eng.toUpperCase()); // "HELLO"
console.log(eng.toLowerCase()); // "hello"

// החלפה
console.log(text.replace("עולם", "JavaScript")); // "שלום JavaScript"

// פיצול
console.log("א,ב,ג".split(",")); // ["א", "ב", "ג"]

// הסרת רווחים
console.log("  שלום  ".trim()); // "שלום"

סיכום

טיפוס דוגמה typeof
String "שלום" "string"
Number 42, 3.14 "number"
Boolean true, false "boolean"
undefined undefined "undefined"
null null "object"
Symbol Symbol() "symbol"
BigInt 123n "bigint"

כללי אצבע: - השתמשו ב-const כברירת מחדל - השתמשו ב-let רק כשצריך לשנות - הימנעו מ-var - השתמשו ב-template literals למחרוזות

בדקו את עצמכם

נסו לענות לבד לפני שאתם פותחים את התשובה.

  1. מתי משתמשים ב-const?

    1. רק למספרים
    2. אף פעם
    3. כברירת מחדל, לכל ערך שלא מקבל השמה מחדש
    4. רק לפונקציות
    הצגת התשובה

    תשובה ג. const כברירת מחדל, let רק כשצריך לשנות, ו-var לא בכלל.

  2. const user = { name: 'דנה' }; user.name = 'יוסי'; מה יקרה?

    1. עובד: const מונע השמה מחדש של המשתנה, לא שינוי בתוך האובייקט
    2. name לא משתנה בשקט
    3. user נמחק
    4. שגיאה
    הצגת התשובה

    תשובה א. המשתנה עדיין מצביע על אותו אובייקט. רק user = {...} אסור.

  3. מה מחזיר typeof null?

    1. "null"
    2. שגיאה
    3. "object"
    4. "undefined"
    הצגת התשובה

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