告別「加號」地獄:JavaScript 字串革命與 Template Literals 的魔法

前言:關於「拼貼」的惡夢

假想你正坐在小學時的美勞課教室裡,美術老師發給全班每位同學各一張畫紙,並且要求製作一張「自我介紹」的海報。內容的製作方式規定用最原始的剪貼方法完成,海報內容的製作過程大概是這樣的:

  1. 先在報紙找到並剪下「我」這個字
  2. 拿起膠水把「我」這個字貼到畫紙
  3. 接著再剪下「叫做」這個字,貼上去
  4. 找不到合適的字,就改用彩色筆寫上自己的名字「王小明」
  5. 然後繼續剪下「,今年」這幾個字……

這種製作過程鐵定弄得滿手都是膠水不說,如果不小心貼歪了、或者字與字中間忘記留空白,整張海報就毀了。在 2015 年之前的 JavaScript 世界(ES5 時代),程式設計師處理文字(String)的方式,就很類似這種原始的剪貼方式,這種技巧被稱之為「字串串接(String Concatenation)」。

自從 ES6 版本發布後,JavaScript 獲得一項神級裝備:Template Literals(樣板字面值),俗稱樣板字串。它就像是一張設計好的「數位表單」,你只需要在空格裡填字,其他的格式電腦自動幫你處理好。我們就用大學生的日常情境,來聊聊這個讓 Web 開發者從地獄飛升到天堂的語法。

第一章:認識新朋友「反引號」

1. 鍵盤上的邊緣人

首先,我們要尋找開啟魔法的鑰匙。 低頭看看鍵盤左上角 Esc 鍵的下面、數字 1 鍵的左邊,有一個長得像毛毛蟲的符號 ~,在那個鍵上,還存在著一個不起眼的小撇號 `。這個小撇號有個英文名字叫做 Backtick,中文則叫它「反引號」。

  • 舊時代的字串:使用單引號 ‘ ‘ 或雙引號 ” “
  • 新時代的樣板字串:必須使用反引號 ` ` 包起來

2. 為什麼要換符號

我自己當初是蠻好奇:「單引號用得好好的,幹嘛多學一個符號?」深入研究才逐漸地理解因為單引號和雙引號在處理「文字裡的引號」時很痛苦,假設你要在螢幕上印出這句話:I’m a student at “NTU”.

如果你用單引號寫:

JavaScript

// 錯誤示範
let str = 'I'm a student...'; // 程式爆掉!

電腦讀到 I 後面的單引號,就會以為字串結束了,後面的 m 會被當成亂碼。你必須用反斜線 \ 來轉譯(Escape),寫成 ‘I\’m a student…’。

但如果你用反引號

JavaScript

// 完美示範
let str = `I'm a student at "NTU".`;

在反引號的世界裡,單引號和雙引號都是普通的文字,完全不需要特殊處理。這就像是給了文字一個專屬的 VIP 包廂,外面怎麼吵都影響不了裡面。

第二章:填空遊戲的藝術「變數嵌入 (Interpolation) 」

這是 Template Literals 最強大的功能,也是它被稱為「樣板」的原因。

1. 舊時代的「加號」地獄

假設你在寫一則社群網站的歡迎訊息,內容包含兩個變數:name 和 count(代表通知數量)。

舊寫法:

JavaScript

const name = "傑哥";
const count = 5;

// 注意那個 '+' 和裡面無數個引號
const msg = "哈囉," + name + "!您目前有 " + count + " 則新通知。";

這種寫法有幾個致命缺點:

  1. 容易寫錯: 你很容易忘記加空格,變成 哈囉,傑哥!您目前有5則新通知。(黏在一起)
  2. 閱讀困難: 程式碼被切得支離破碎,很難一眼看出這句話原本長怎樣
  3. 手很酸: 你要一直按 Shift 鍵輸入雙引號或加號

2. 新時代的 ${} 魔法

讓我們看看樣板字串怎麼做?其實有點像是在玩填字遊戲。

新寫法:

JavaScript

const name = "傑哥";
const count = 5;

// 乾淨、直觀
const msg = `哈囉,${name}!您目前有 ${count} 則新通知。`;

看到那個 ${} 了嗎?這就是魔法所在。

  • 規則: 在反引號 `…` 的範圍內,只要看到 ${…},電腦就會自動把花括號裡面的變數「算出來」,然後把結果填進去。

這就像是你在寫一張邀請卡:「親愛的 ________,誠摯邀請您參加…」,你不需要把紙剪開再黏貼名字,只需要在橫線上填寫名字就好。這讓程式碼的可讀性提升了一個檔次,你寫的程式碼長得就跟輸出的結果一模一樣。

第三章:詩人的救贖「多行字串 (Multi-line Strings) 」

1. 舊時代的 \n

想像你要在網頁上印出一首唐詩或者一段分行的地址。在以前,JavaScript 的字串是不允許直接換行的。如果你在程式碼裡按下 Enter 鍵,程式會報錯,你必須使用特殊的換行符號 \n (Newline):

JavaScript

// 舊寫法:醜陋且難以排版
const poem = "床前明月光,\n" +
             "疑是地上霜。\n" +
             "舉頭望明月,\n" +
             "低頭思故鄉。";

這種用法就像從使用打字機寫詩保留下來的習慣,每次換行都要手動推一下機器,非常不直覺。

2. 新時代:想換行就換行

Template Literals 完全保留程式碼中的排版,如果你在反引號裡按下了 Enter,輸出的字串裡就會真的有一個 Enter。

JavaScript

// 新寫法:所見即所得
const poem = `
  床前明月光,
  疑是地上霜。
  舉頭望明月,
  低頭思故鄉。
`;

這對於程式開發者寫 HTML 結構或是 SQL 查詢語句時非常有用,你可以把程式碼排版得漂漂亮亮,不用擔心被擠成一坨。

第四章:字串裡的微型計算機「表達式嵌入」

還記得剛剛說的 ${} 嗎?它不只能放變數,其實也可以放任何 JavaScript 的表達式(Expression)

1. 什麼是表達式

簡單來說,只要能「算出一個值」的東西,都叫表達式,舉例:

  • 1 + 1 是表達式(算出 2)
  • age >= 18 是表達式(算出 true 或 false)
  • Math.max(10, 20) 是表達式(算出 20)

2. 在字串裡算數學

假設你從網路買了 3 本書,每本 200 元,你想印出總價。

JavaScript

const price = 200;
const quantity = 3;

// 直接在 ${} 裡面做乘法!
const total = `您購買了 ${quantity} 本書,總金額是 ${price * quantity} 元。`;

console.log(total); // 印出:您購買了 3 本書,總金額是 600 元。

你不需要先在外面宣告一個 let sum = price * quantity,直接在字串裡算就好,這就像是你的收據紙上內建了一台計算機。

3. 字串裡的邏輯判斷「三元運算子 (Ternary Operator) 」

三元運算子是一種進階撰寫技巧,在 Web 開發超級常用。假設你要顯示使用者的登入狀態,

JavaScript

const isLogin = true;
// 如果 isLogin 是 true,顯示「歡迎回來」;否則顯示「請先登入」
const status = `系統訊息:${ isLogin ? "歡迎回來" : "請先登入" }`;

這讓你的文字具有了「智慧」,能根據狀況自動改變內容,而不用寫一大堆 if…else。

第五章:前端開發的神器「HTML 樣板」

HTML 樣板大概是 Template Literals 對 Web 開發貢獻最大的地方,假設你是系學會網站的管理員,打算把「幹部名單」顯示在網頁上。如果不使用現代網頁開發框架,只用原生 JavaScript 撰寫網頁的程式碼,你極有可能會寫到想哭出來。

舊寫法(字串拼接地獄):

JavaScript

const member = { name: "小華", job: "公關長" };
const html = "<div class='card'>" +
             "  <h2>" + member.name + "</h2>" +
             "  <p>" + member.job + "</p>" +
             "</div>";
// 只要少一個引號,網頁就破圖

新寫法(樣板字串):

JavaScript

const member = { name: "小華", job: "公關長" };

// 就像在寫真的 HTML 一樣!
const html = `
  <div class="card">
    <h2>${member.name}</h2>
    <p>${member.job}</p>
  </div>
`;

看到差別了嗎?新寫法不僅保留 HTML 的縮排結構,讓我們一眼就能看出網頁長什麼樣子。而且,變數插入的位置也一目了然,這對於初學者理解「JavaScript 如何控制網頁」是非常好的寫作方法。

第六章:進階魔法「標籤樣板字面值 (Tagged Templates) 」

最後,我們來介紹一個聽起來很學術,但其實很有趣的功能:Tagged Templates。 這有點像是你把字串丟進一座「加工廠」裡,出來的東西會變不一樣,它的語法長這樣:

JavaScript

function highlight(strings, ...values) {
  // 這裡可以寫邏輯來處理字串...
  // 例如把變數都加上紅色的 HTML 標籤
}

const name = "小明";
const action = "睡過頭";
// 注意!highlight 後面直接接反引號,沒有括號!
const result = highlight`昨天 ${name} 又 ${action} 了`;

雖然初學者可能暫時用不到這個,但如果你未來學習 React 這個熱門框架,你會看到一個很有名的套件叫 styled-components,它就是用這種魔法來寫 CSS 樣式的。

結語:從工具看見思維的轉變

JavaScript 的 Template Literals 不僅僅是一種「新語法」,也代表程式語言設計思維的轉變:從「配合電腦」轉向「配合人類」

  • 以前: 我們為了配合電腦的邏輯,把一句完整的話拆得支離破碎,用一堆加號黏起來。
  • 現在: 電腦配合我們的閱讀習慣,讓我們用最自然的語氣、最直觀的排版來撰寫程式碼。

對於開發者來說,這就像是從手寫筆記進化到使用 Notion 或 iPad 筆記一樣。內容本質可能沒變,但工具的便捷性會讓你更願意去創作、去開發。下一次,當你在寫 JavaScript 或者試著做自己的個人網站時,看到那個要按 Shift 才能打出來的 + 號,請停下來想一想: 「是不是該按下鍵盤左上角的那個魔法鍵 ` 了?」

擁抱 Template Literals,讓你的程式碼像詩一樣優雅吧!

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *