Menu

מחרוזות ו-Template Literals ב-JavaScript: Backticks, שילוב ערכים ומתודות

איך מחרוזות עובדות ב-JavaScript: מרכאות, backticks, שילוב ערכים בטקסט, טקסט מרובה שורות והמתודות שבאמת תשתמשו בהן.

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

שלוש דרכים לכתוב מחרוזת

JavaScript נותנת לכם שלושה סוגי תוחמים למחרוזות. שניים מהם ניתנים להחלפה זה בזה; השלישי עושה יותר.

מרכאות בודדות וכפולות יוצרות מחרוזות זהות לגמרי. בחרו אחת והיצמדו אליה (רוב בסיסי הקוד המודרניים משתמשים כברירת מחדל במרכאות בודדות, או נותנים לכלי עיצוב להחליט). Backticks יוצרים template literal, ושם העניינים נהיים מעניינים: הם מאפשרים לשלב ערכים בטקסט ולפרוס אותו על פני כמה שורות.

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

תווי Escape ומרכאות בתוך מחרוזת

בתוך מחרוזת, לוכסן הפוך פותח רצף escape. הנפוצים הם \n (שורה חדשה), \t (טאב), \\ (לוכסן הפוך עצמו), ו-\" / \' כדי לשלב את אותו סוג מרכאות שבו פתחתם:

אפשר להימנע מרוב תווי ה-escape אם בוחרים את סוג המרכאות השני: 'She said "hi" and left.' לא צריך אף לוכסן הפוך. עדיף פרגמטיות על פני דוגמטיות.

Template Literals: כוח העל של ה-Backtick

Template literal עושה שני דברים שמחרוזות רגילות לא יכולות. ראשית, הוא משלב ביטויים בטקסט עם ${...}:

כל מה שנמצא בתוך ${...} הוא ביטוי JavaScript, לא רק שם של משתנה. חשבון, קריאות לפונקציות, אופרטור טרנרי, ואפילו template literals אחרים, הכול מותר:

שנית, template literals נפרסים על פני כמה שורות בלי צורך ב-\n:

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

שילוב ערכים עדיף על שרשור

לפני template literals, הדרך היחידה לבנות מחרוזת דינמית הייתה האופרטור +:

שתיהן מפיקות פלט זהה. ה-template literal נקרא כמו המשפט שהוא בונה, בעוד שגרסת ה-+ מכריחה אתכם לעקוב אחרי מרכאות, רווחים ואופרטורים של שרשור. השתמשו ב-+ רק כשאתם מוסיפים משהו קטן אחד למחרוזת קיימת. לכל דבר ארוך יותר, לכו על backticks.

מחרוזות הן Immutable

כל מתודה שנראה שהיא משנה מחרוזת בעצם מחזירה מחרוזת חדשה:

אם אתם רוצים את השינוי, צריך לשמור את התוצאה איפשהו. זה תופס מתחילים שכותבים s.replace("a", "b") ומצפים ש-s ישתנה. הוא לא משתנה. מחרוזות ב-JavaScript הן כמו מספרים: את הערך עצמו אי אפשר לשנות, אפשר רק לגרום למשתנה להצביע על ערך חדש.

מתודות המחרוזת שבאמת תשתמשו בהן

ה-API המלא של מחרוזות גדול. הנה קומץ המתודות שתשתמשו בהן כל יום:

כמה הערות ששווה לזכור:

  • length הוא מאפיין, לא מתודה, ולכן אין סוגריים.
  • replace עם מחרוזת רגילה מחליף רק את ההתאמה הראשונה. השתמשו ב-replaceAll או בביטוי רגולרי עם הדגל g כדי להחליף את כל המופעים.
  • slice(start, end) מקבל טווח חצי פתוח: התו שבמיקום end לא נכלל.
  • אינדקסים שליליים ב-slice נספרים מהסוף: s.slice(-3) מחזיר את שלושת התווים האחרונים.

גישה לתווים ומעבר עליהם

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

for...of עובר על code points, ולכן מטפל נכון ברוב ה-Unicode. שימוש באינדקסים (s[i]) עובר על יחידות קוד של UTF-16, מה שעלול לפצל אימוג'י ותווים אחרים מחוץ ל-BMP לשניים. לטקסט רגיל שתי הדרכים בסדר; לכל טקסט שמגיע ממשתמשים, העדיפו for...of או [...s].

Tagged Template Literals

יש עוד צורה אחת ששווה להכיר, גם אם לא תכתבו אותה לעיתים קרובות. Tagged template literal קורא לפונקציה ומעביר לה את חלקי הטקסט הקבועים ואת הערכים המשובצים כארגומנטים נפרדים:

פונקציית ה-tag מחליטה איך תיראה המחרוזת הסופית: היא יכולה לבצע escape ל-HTML, לבנות SQL בצורה בטוחה, לקמפל CSS או לנתח GraphQL. תפגשו את הדפוס הזה בספריות (styled-components, graphql-tag, lit-html) הרבה יותר מאשר תכתבו אחד בעצמכם. אבל כשתצטרכו עיבוד מחרוזות מותאם אישית, tags הם הכלי הנקי ביותר למשימה.

מלכודות נפוצות

רשימה קצרה של דברים שמכשילים אנשים:

  • שוכחים לשמור את התוצאה של מתודה. s.trim() לבדו לא עושה כלום.
  • משתמשים ב-+ כדי לשרשר מספר ומחרוזת. "Age: " + 30 + 5 הוא "Age: 305", לא "Age: 35". Template literals עוקפים את הבעיה: `Age: ${30 + 5}`.
  • מבלבלים בין == להשוואת מחרוזות. נעסוק בשוויון כמו שצריך בהמשך, אבל "1" == 1 הוא true ו-"1" === 1 הוא false. העדיפו ===.
  • מניחים ש-length שווה למספר התווים. באימוג'י ובתווים אחרים שבנויים מזוג surrogate, "".length הוא 2, לא 1. השתמשו ב-[..."".length] או ב-Array.from(s).length כשאתם צריכים את התווים כפי שהמשתמש רואה אותם.

הבא בתור: Numbers ו-BigInt

מחרוזות הן טיפוס פרימיטיבי אחד; מספרים הם טיפוס אחר, ולמערכת המספרים של JavaScript יש מוזרויות משלה: טיפוס Number יחיד גם למספרים שלמים וגם לשברים, ובנוסף BigInt למקרים שבהם זה לא מספיק. זה העמוד הבא.

שאלות נפוצות

מה ההבדל בין מרכאות ל-backticks ב-JavaScript?

מרכאות בודדות (') וכפולות (") יוצרות מחרוזות רגילות, והן ניתנות להחלפה זו בזו. Backticks (`) יוצרים template literals, שתומכים בשילוב ערכים עם ${...} ובטקסט על פני כמה שורות בלי תווי escape. השתמשו ב-backticks בכל פעם שאתם מכניסים משתנה לטקסט או כותבים טקסט על פני כמה שורות.

איך מכניסים משתנה לתוך מחרוזת ב-JavaScript?

משתמשים ב-template literal: עוטפים את המחרוזת ב-backticks ושמים את הביטוי בתוך ${...}. לדוגמה, `Hello, ${name}!` מחשב את name ומשבץ את התוצאה בטקסט. אפשר לשים בפנים כל ביטוי: ${a + b}, ${user.name.toUpperCase()}, ואפילו template literals מקוננים.

האם מחרוזות ב-JavaScript הן immutable?

כן. כל מתודת מחרוזת (toUpperCase, slice, replace וכן הלאה) מחזירה מחרוזת חדשה במקום לשנות את המקורית. אם כותבים s.toUpperCase() ולא שומרים את התוצאה בשום מקום, שום דבר לא משתנה. זה אותו מודל כמו מחרוזות ב-Python או ב-Java.

מה הם tagged template literals?

Tagged template literal קורא לפונקציה ומעביר לה את חלקי הטקסט של התבנית ואת הערכים המשובצים כארגומנטים נפרדים: tag`Hello, ${name}` מפעיל את tag(["Hello, ", ""], name). ספריות כמו styled-components ו-graphql-tag משתמשות ב-tags כדי לנתח או לשנות את התבנית לפני שהן מפיקות את הערך הסופי.

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

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

להתחיל