שלוש דרכים לכתוב מחרוזת
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 כדי לנתח או לשנות את התבנית לפני שהן מפיקות את הערך הסופי.