מצב תצוגה
אופרטורים
לאחר שהכרנו את המושג משתנים הפרק נלמד כיצד ניתן לשנות את המידע הקיים בהם. פעולה זו נעשת בין היתר בעזרת אופרטורים.
Operator אופרטור – מפעיל בתרגום ישיר – הוא סמל מסוים המאפשר לבצע פעולות על אופרנד אחד או יותר.
מסובך? במילים פשוטות יותר "אופרטור הוא תו כלשהוא אתו ניתן לבצע השוואה בין נתונים, פעולות חשבוניות ואף לעדכן נתונים"
כבר פגשנו יותר מאופרטור אחד עד עכשיו דוגמת אופרטור ההצבה =
או אופרטור החיסור מספר -
וכעת נכיר את רובם הנותרים.
התחביר אופרטור מבצע את פעולות על אופרנד אחד או יותר. אופרנד = האיבר עליו מבוצע הפעולה של האופרטור. לדוגמא נסתכל אופרטור ההצבה בקוד הבא
javascript
let a;
a = 5;
בשורה הראשונה הגדרנו את המשתנה, נתעלם ממנה. בשורה השנייה הגדרנו שלמשתנה a
יהיה את הערך 5. פעולה זו התבצעה בעזרת אופרטור ההצבה.
אופרטור ההצבה נקרא אופרטור בינארי (בינארי = דבר בעל שני ערכים אפשריים) כיוון שהוא זקוק לשני אופרנדים כדי להשלים את פעולתו. ככה:
דיאגרמה המציגה את שם המשתנה עם חץ המצביע שהוא האופרנד השמאלי ועל מספר 5 שהוא האופרנד הימני ועל סמל ההצבה שהוא האופרטור
בדוגמה הבאה אנו מציבים במשתנה a
ערך המורכב מפעולה של אופרטור נוסף, אופרטור החיבור +
.
javascript
let a;
a = 5 + 4;
console.log(a);
בשורה אחרונה יש משהו שאולי לא נפגשנו איתו עד כה וזו הפקודה console.log(a)
. מטרת פקודה זו היא להדפיס למסך את הערך שהיא מקבלת. במקרה שלנו היא תדפיס את הערך הנוכחי של a שהוא 9. ניתן להריץ הדוגמה, לשנות איתה ולראות את ההדפסה מתעדכנת בהתאם.
גם אופרטור החיבור הוא אופרטור בינארי וגם אופרטור ההצבה הוא בינארי. אם כן, איך ניתן להסביר את השורה הקודמת שראינו הרי נראה שיש כאן מספר גדול יותר של אופרנדים?
הסתכלו על התרשים הבא
דיאגרמה בה רואים את פעולת החיבור בתוך ריבוע אחד וכתוב בצד ימין למטה מתבצע קודם, ואז את הכל בתוך ריבוע שני שהוא מתבצע שני. ומתחת בעצם מראה חץ שקודם כל מתבצע 5+4 והוא נהיה שווה 9 ואז זה פשוט נהפך ל- a=9
מה שקורה בעצם זה שמפרש השפה קודם כל יריץ את הפעולה החשבונית של 5+4
של אופרטור החיבור ורק כאשר תהיה בידו התוצאה, לאחר מכן התוצאה תשלח לאופרטור ההצבה וממילא כל אופרטור מתעסק רק עם שני אופרנדים בו זמנית.
איך נדע איזה אופרטור רץ קודם? לשם כך יצרו את הטבלה קדימות אופרטורים.
קדימות אופרטורים
טבלת קדימות אופרטורים בתכנות דומה ברובה לטבלת קדימות אופרטורים במתמטיקה והיא כדלהלן:
קדימות | מזהה | סיווג | דוגמא | תוצאה אפשרית |
---|---|---|---|---|
1 | () | קיבוץ | (5+9) * 60 | 840 |
2 | . | גישה לחבר | Object.member | - |
2 | [] | גישה לחבר | Object[‘member’] | - |
2 | New | יצירה | new Date() | Date Object |
2 | () | קריאה לפונקציה | Func() | - |
3 | ++ -- | הוספה \ החסרה אחר המשתנה | a++, a-- | - |
4 | ++ -- | הוספה \ החסרה לפני המשתנה | ++a, --a | - |
4 | ! | שלילה לוגית | !true | false |
4 | Typeof | טיפוס | Typeof a | Number |
5 | ** | חזקה | 4**4 | 256 |
6 | * | הכפלה | 4*4 | 16 |
6 | / | חילוק | 16 / 4 | 4 |
6 | % | שארית | 17 % 4 | 1 |
7 | + | חיבור | 8+8 | 16 |
7 | - | חיסור | 16 – 8 | 8 |
9 | < | השוואה פחות מ- | 10 < 8 | false |
9 | <= | השוואה פחות או שווה ל- | 10 <= 10 | true |
9 | > | השוואה יותר מ- | 10 > 52 | false |
9 | >= | השוואה יותר או שווה ל- | 10 >= 10 | true |
9 | Instance of | בדיקת טיפוס יורש | A instanceof B | true |
10 | == | בדיקת שוויון | 10 == ‘10’ | true |
10 | != | בדיקת חוסר שוויון | 10 != 12 | true |
10 | === | שוויון קפדני | 10 === ‘10’ | false |
10 | !=== | בדיקת חוסר שוויון קפדני | 10 !== ‘10’ | true |
14 | && | שני התנאים נכונים | 5 < 10 && 5 > 2 | true |
15 | || | רק אחד התנאים אמיתי | 5 < 10 || 5 < 2 | true |
16 | ?: | תנאי טרינארי | 5 > 10 ? true : false; | false |
17 | = | הצבה | A = 5; | 5 |
לא כל האופרטורים האפשריים מוצגים ולא את כל האופרטורים נלמד בפרק זה אך תמיד ניתן לחזור לטבלה להיזכר בקדימות של אופרטור כל שהוא.
אגב אופרטורים יכולים להיות גם מילה ולאו דווקא תו, אופרטור היצירה לדוגמא הוא אחד כזה.
כיצד ניתן לכפות סדר שונה לקדימות באופרטורים? אם נשים לב נראה שסימן הסוגריים הוא מאוד גבוה בסדר הקדימות. פרוש העניין שכל סט אופרנדים עם אופרטור שנקיף בתוך סוגריים קודם, כך לדוגמא התוצאה של המשתנה withoutBraces
ושל המשתנה withBraces
תהיה שונה למרות שנראה שהפעולה החשבונית זהה, עבור המשתנה withBraces
כפינו סדר פעולות שונה בעזרת הסוגריים.
javascript
let withoutBraces = 10 + 5 * 60;
let withBraces = (10 + 5) * 60;
console.log(withoutBraces);
console.log(withBraces);
הפלט שנקבל יהיה
sh
310
900
עבור המשתנה withoutBraces
אופרטור הכפל ירוץ קודם וזה בעצם מה שיקרה
javascript
let withoutBraces = 10 + (300)
כיוון שעבור המשתנה withBraces
הצבנו את אופרטור החיבור בתוך סוגריים כך שזה בעצם מה שיקרה
javascript
let withBraces = (15) * 60;
אם ככה למה שנכתוב הקוד בצורה כזו מסובכת? פשוט נכתוב 15 * 60
במקום לחבר את 10
ו-5
בתוך סוגריים? בכזה מקרה זאת כנראה תהיה הגישה הנכונה. אך במקרים אחרים בהם פעולות מתמטיות שנבצע יהיו בין משתנים שערכם כלל לא ידוע, בכזה מקרה הסוגריים נעשים מאוד שימושיים.
אופרטורים מתמטיים
אופרטורים מתמטיים הינם אופרטורים בינאריים כאלה הדורשים שני אופרנדים להשלמת פעולת האופרטור. את הערך המוחזר מאופרטור מתמטי ניתן להציב למשתנה או בין הסוגריים של console.log כמו שניראה בדוגמה הבאה. נסו לנחש לפני הפלט מה תהיה התוצאה של כל שורה.
javascript
Console.log(5 + 6);
Console.log(5 - 6);
Console.log(5 * 6);
Console.log(5 / 6);
Console.log(5 % 6);
Console.log(5 ** 6);
אופרטורים של הצבה
אופרטורים אלו מאוד נפוצים. אנו מכירים את הרגיל
javascript
let a;
a = 5 + 4;
console.log(a);
אך אופרטורים אלו יכולים להיות מורכבים יותר. ניקח לדוגמה את קטע הקוד הבא בו אנו רוצים להוסיף למשתנה a 5 לערכו הנוכחי. נבצע זאת בשיטה הבאה
javascript
let a = 5;
a = a + 5;
console.log(a);
בעצם מה שעשינו הוא להגדיר ש-a שווה ל-a, לעצמו, פלוס 5. כך יוצא שהשווי הסופי שלו שווה 10.
כיוון שפעולה זו וכן פעולות דומות של חיסור, הכפלה וחילוק הם כל כך נפוצים הם ניתנים לחיבור ולכן נוכל לכתוב את קטע הקוד הקודם בצורה הבאה.
javascript
let a = 5;
a += 5;
console.log(a);
נראה קצת מבלבל במבט ראשון אבל האופרטור +=
שווה בדיוק ל-a + 5
.
ניתן לבצע פעולת השמה הכוללת בתוכה פעולה מתמטית גם על חיסור, חילוק, הכפלה ושארית בצורה הבאה:
javascript
let a = 10;
a -= 5; // a = a – 5;
console.log(a);
a *= 5; // a = a * 5;
console.log(a);
a /= 5; // a = a / 5;
console.log(a);
a %= 5; // a = a % 5;
console.log(a);
אופרטורים אונריים
אופרטור אונרי הוא כזה העובד רק עם אופרנד אחד. לדוגמא אופרטור ההגדלה-עצמית ++
או אופרטור ההקטנה-עצמית --
עובדים עם אופרנד יחיד.
את האופרטורים האלו ניתן לכתוב לפני או אחרי המשתנה ויש לכך משמעות. במקרה והאופרטור נכתב לפני המשתנה הוא יתבצע קודם ורק אח"כ תתבצע ההצבה. אך במקרה והוא נכתב לאחר המשתנה קודם כל תתבצע ההצבה של ערך המשתנה ורק לאחר מכן הוא פעולת האופרטור תתבצע.
javascript
let number = 5;
let a = ++number;
number = 5;
let c = number++;
console.log(number);
console.log(a);
console.log(c);
נראה שהערך של המשתנה a
הוא 6 כיוון שביצענו את אופרטור ההגדלה-עצמית לפני המשתנה. הערך של המשתנה b
לעומת זאת שווה 5 כיוון שהאופרטור נכתב אחרי המשתנה.
אופרטור טרינארי
ישנו אופרטור אחד טרינארי – כזה העובד עם שלושה אופרנדים – וזהו האופרטור התנאי הטרינאר, אותו נכיר יחד עם שאר האופרטורים ההשוואתיים בפרק על תנאים.