Menu

אופרטורים ב-JavaScript: חשבון, השוואה, לוגיקה ועוד

האופרטורים ש-JavaScript נותנת לכם לחישובים, להשוואת ערכים, לשילוב ערכים בוליאניים ולהשמה, עם המוזרויות שבאמת מפילות בפועל.

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

אופרטורים הם הדרך שבה ביטויים עושים עבודה

כל שורה לא טריוויאלית של JavaScript בנויה מאופרטורים: סימנים שלוקחים ערך אחד או שניים ומפיקים ערך חדש. + מחבר, === משווה, && משלב ערכים בוליאניים, ? : בוחר בין שני ערכים. רובם מוכרים משפות אחרות; לכמה מהם יש מוזרויות ייחודיות ל-JavaScript ששווה להכיר מראש.

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

אופרטורי חשבון

הבסיסיים מתנהגים כמו שהייתם מצפים:

כמה דברים ששווה לציין:

  • / תמיד מבצע חילוק של floating-point. 7 / 2 הוא 3.5, לא 3. השתמשו ב-Math.floor(7 / 2) או ב-Math.trunc(7 / 2) אם אתם רוצים מספר שלם.
  • % הוא שארית, לא מודולו מתמטי אמיתי. הוא שומר על הסימן של האופרנד השמאלי: -7 % 3 הוא -1, לא 2.
  • + עמוס במשמעויות. אם אחד הצדדים הוא מחרוזת, הוא משרשר במקום לחבר: "3" + 1 הוא "31". עוד על זה בעוד רגע.

הגדלה והקטנה

ההבדל בין count++ לבין ++count חשוב רק כשמשתמשים בערך של הביטוי באותה שורה. כפקודה עצמאית, הם עושים אותו דבר. רוב מדריכי הסגנון מעדיפים count += 1 לשם הבהירות.

לאופרטור + יש שתי אישיויות

זה מפיל את כולם לפחות פעם אחת:

אם אחד האופרנדים הוא מחרוזת, + הופך לשרשור מחרוזות וממיר את הצד השני למחרוזת. כל שאר אופרטורי החשבון הולכים לכיוון ההפוך: הם ממירים מחרוזות למספרים:

המסקנה: כשאתם בונים מחרוזות, העדיפו template literals (`price: ${5}`). כשאתם עושים חישובים, ודאו שהקלט שלכם באמת מספרים: Number(x) או parseInt(x, 10) ממירים במפורש.

אופרטורי השוואה

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

=== ו-!== הם קפדניים: אותו ערך ואותו טיפוס. == ו-!= ממירים טיפוסים לפני ההשוואה, וזה מוביל להפתעות כמו null == undefined שהוא true או [] == false שהוא true. השתמשו ב-=== וב-!== כברירת מחדל. החריג הנפוץ היחיד הוא x == null, קיצור נוח ל"האם x הוא null או undefined?"

אופרטורי הסדר עובדים כמצופה על מספרים, ובסדר אלפביתי על מחרוזות:

השוואת מחרוזות מבוססת על קודי תווים, ולכן היא רגישה לאותיות גדולות וקטנות. אם אתם צריכים מיון ידידותי לבני אדם, השתמשו ב-String.prototype.localeCompare.

אופרטורים לוגיים

&& (וגם), || (או) ו-! (לא) משלבים ערכים בוליאניים, אבל הם מעניינים יותר ממה שאלגברה בוליאנית טהורה הייתה מרמזת.

הטוויסט: && ו-|| לא מחזירים true או false. הם מחזירים את אחד ה_אופרנדים_ שלהם. && מחזיר את הערך ה-falsy הראשון, או את האחרון אם כולם truthy. || מחזיר את הערך ה-truthy הראשון, או את האחרון אם כולם falsy.

לכן תראו דפוסים כמו const displayName = user.name || "Guest": בחרו את הדבר הראשון שאינו ריק. זה תמציתי, אבל היזהרו: || מתייחס ל-0, "" ו-false כמפעילי ברירת מחדל. אם אלה ערכים לגיטימיים אצלכם, השתמשו ב-?? במקום (בהמשך).

שני האופרטורים גם עושים short-circuit: אם הצד השמאלי כבר קובע את התשובה, הצד הימני לא רץ אף פעם.

אופרטור ה-Nullish Coalescing ??

?? דומה ל-|| אבל נכנס לפעולה רק עבור null או undefined, לא עבור 0, "" או false.

השתמשו ב-?? כשערך לגיטימי עשוי להיות falsy: ספירות, מחרוזות ריקות, false מפורש. השתמשו ב-|| כשכל ערך falsy צריך לסמן "חסר". בקוד מודרני, ?? היא ברירת המחדל הבטוחה יותר לערכים אופציונליים עם ברירות מחדל שאינן null.

אופרטורי השמה

= מציב ערך. הצורות המורכבות משלבות השמה עם אופרטור נוסף:

יש גם אופרטורי השמה לוגיים, ||=, &&= ו-??=, שמציבים ערך רק אם הערך הנוכחי עומד בתנאי:

הם שימושיים למילוי ברירות מחדל בלי פקודות if ארוכות.

אופרטור ה-Ternary

condition ? a : b הוא גרסת ביטוי של if/else. הוא מחזיר את a כשהתנאי truthy, ואת b אחרת:

Ternary מצטיין בבחירת ערך קצרה. הוא הופך לקשה לקריאה ברגע שמקננים אותו: אם אתם מוצאים את עצמכם כותבים a ? b : c ? d : e, עברו ל-if/else או לאובייקט חיפוש.

typeof ו-instanceof

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

שתי מלכודות ששווה לזכור: typeof null הוא "object" (באג מ-1995 שנשאר לתמיד), וגם מערכים מדווחים "object". השתמשו ב-Array.isArray(x) למערכים וב-x === null ל-null.

instanceof בודק אם אובייקט נבנה מבנאי מסוים:

Spread ו-Rest משתמשים באותו ...

תראו ... בשני מקומות. בתור spread, הוא פורש iterable לאיברים בודדים:

בתור rest, הוא אוסף כמה ערכים למערך אחד, בדרך כלל בפרמטרים של פונקציה או בפירוק:

אותו תחביר, עבודות הפוכות. Spread פורק; rest אוסף. מי זה מי נקבע לפי ההקשר: בקריאה או בליטרל הוא פורש; ברשימת פרמטרים או בתבנית פירוק הוא אוסף.

קדימות אופרטורים (בספק, הוסיפו סוגריים)

לאופרטורים יש קדימות שקובעת מי רץ ראשון כשמערבבים אותם. כפל גובר על חיבור, השוואה גוברת על לוגיקה, וכן הלאה:

הטבלה המלאה ארוכה, ואף אחד לא זוכר את כולה. הרגל פשוט מכסה 99% מהמקרים: כשאתם מערבבים אופרטורים ואתם לא בטוחים בסדר, הוסיפו סוגריים. הקוד קריא יותר ולא תלוי בזיכרון של הקורא.

אופרטורי סיביות (לרוב לא מה שאתם צריכים)

לשם השלמות: &, |, ^, ~, <<, >> ו->>> פועלים על הייצוג הבינארי של מספרים שלמים. תראו אותם בקוד גרפי, בפרוטוקולים ברמה נמוכה, ומדי פעם ב-API שמשתמש ב-bitmask של דגלים.

טריק נפוץ אבל מפוקפק: n | 0 חותך מספר למספר שלם של 32 ביט, ואנשים נהגו לנצל אותו כ-Math.trunc מהיר יותר. אל תעשו את זה: Math.trunc ברור יותר ועובד גם למספרים מחוץ לטווח של 32 ביט.

הבא בתור: if/else

אופרטורים מפיקים ערכים; if/else משתמש בערכים האלה כדי לבחור איזה ענף קוד להריץ. רוב מה שתעשו עם אופרטורי ההשוואה והלוגיקה שלמעלה הוא להזין את התוצאות שלהם לתנאים, ובדיוק על זה העמוד הבא.

שאלות נפוצות

מהם האופרטורים העיקריים ב-JavaScript?

ב-JavaScript יש אופרטורי חשבון (+, -, *, /, %, **), השוואה (===, !==, <, >), לוגיקה (&&, ||, !), השמה (=, +=, -=), וכמה מיוחדים כמו ה-ternary ? :, typeof ו-nullish coalescing ??. הם אבני הבניין של ביטויים ושל בקרת זרימה.

מה ההבדל בין == לבין === ב-JavaScript?

=== בודק שגם הערך וגם הטיפוס תואמים. == ממיר טיפוסים לפני ההשוואה, ולכן 0 == "0" הוא true אבל 0 === "0" הוא false. השתמשו ב-=== כברירת מחדל: כללי ההמרה של == עדינים מספיק כדי לגרום לבאגים שלא תזהו ב-code review.

מה עושה אופרטור ה-ternary ב-JavaScript?

condition ? a : b הוא if/else בשורה אחת שמחזיר ערך. אם condition הוא truthy הביטוי מחושב ל-a, אחרת ל-b. הוא שימושי לביטויים תנאיים קצרים כמו const label = count === 1 ? 'item' : 'items', אבל ternary מקונן הופך במהירות לקשה לקריאה.

מתי להשתמש ב-?? במקום ב-||?

|| עובר לברירת המחדל עבור כל ערך falsy, כולל 0, "" ו-false. ?? עובר לברירת המחדל רק עבור null או undefined. אם אתם רוצים ש-count ?? 10 ישמור על 0 לגיטימי, השתמשו ב-??. אם אתם באמת רוצים שכל ערך falsy יפעיל את ברירת המחדל, הישארו עם ||.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל