前幾篇我們認識了數字型態,知道 JavaScript 怎麼儲存和計算數字。
但程式不可能只處理數字——你一定也需要處理文字,像是使用者的名字、一段訊息、或是一個網址。
在 JavaScript 裡,文字是用另一種資料型態來表示的,叫做字串(String)。
這篇文章會帶你了解:字串怎麼寫、JavaScript 怎麼儲存文字、特殊字元怎麼處理、以及字串可以做什麼運算。
JavaScript 中的字串怎麼寫?
字串就是一段用引號包起來的文字。
在 JavaScript 裡,你可以用三種引號來包住字串:
"Lie on the ocean" // 雙引號
'Float on the ocean' // 單引號
`Down on the sea` // 反引號三種都可以,只有一個規則:開頭和結尾的引號必須是同一種。
用雙引號開頭就要用雙引號結尾,用單引號開頭就要用單引號結尾,不能混用。
"這樣是對的"
'這樣也是對的'
"這樣就會出錯' // 開頭雙引號,結尾單引號,不行!不管你用哪一種引號,放在引號之間的文字,JavaScript 都會把它當成一個字串值——也就是資料型態為「字串」的資料值。
JavaScript 的字串為什麼叫 String?
你可能會好奇:文字為什麼叫「字串(String)」,而不是「字詞(Word)」?
因為 String 這個詞的重點不是「文字的意義」,而是「把字元串在一起」。
想像每一個字母、數字、空格、標點符號都是一顆珠子。
程式用一條線把這些珠子一顆一顆「串」起來——String 的本意就是「細繩」或「線」,完整的說法是 String of Characters(一串字元)。
這就是為什麼 "Hello World" 是一個 String——空格也是一顆珠子,被串在 o 和 W 之間。
甚至 "ajskdlf" 這種完全沒有意義的亂碼,也是一個有效的 String。
因為 String 在意的是「資料的排列」,不在意「這段文字有沒有意義」。
如果叫 Word(字詞),那就暗示它必須是一個有意義的單字,像 "hello" 或 "cat"。
但實際上,字串可以包含空白、數字、標點符號,甚至是一整篇文章——這些都不是一個「Word」能涵蓋的範圍。
所以下次看到 String,就想像一條線串起一堆珠子,這就對了。
JavaScript 字串可以用 + 連接嗎?
既然字串是「一串珠子」,那能不能把兩串珠子接在一起?
可以。字串可以用 + 運算子來連接——把兩個字串頭尾接在一起,變成一串更長的珠子。
"con" + "cat" + "e" + "nate" // 得到 "concatenate"JavaScript 會把這四段字串依序黏起來,變成一個新的字串 "concatenate"。
不過要注意,字串的 + 做的不是加法,而是連接。
數字可以用 +、-、*、/ 來計算,但字串只有 + 可以用,而且意義完全不同。
至於 -、*、/ 這些運算子,對字串是沒有用的。
字串還有很多其他操作方式,像是取出其中一部分、轉換大小寫等等,這些會在後面的文章介紹。
JavaScript 怎麼儲存字串?用 Unicode 把文字變成數字
前面幾篇提到,電腦的記憶體裡只有位元(0 和 1),而數字可以直接轉換成位元來儲存。
但文字不是數字,那 JavaScript 要怎麼把文字存進記憶體?
做法是:先把每個字元轉換成一個數字,然後再儲存這些數字。
那問題來了——哪個字元對應哪個數字?誰來決定?
答案是一套叫做 Unicode(萬國碼) 的國際標準。
Unicode 幫世界上幾乎每一個字元都分配了一個獨一無二的數字編號,不只是英文字母,包括中文、日文、阿拉伯文、希臘文,甚至是表情符號 😀,都有自己的編號。
有了 Unicode,JavaScript 就能把一段字串變成一串數字,然後用位元儲存在記憶體裡。
16 位元與字元的限制
前面介紹數字型態時提到,JavaScript 用 64 個位元來儲存一整個數字值,不管是 1 還是 9999,都是 64 個位元。
但字串的儲存方式不一樣。
字串不是一個值佔固定的位元數,而是每一個字元各佔 16 個位元。
用圖來看比較清楚:
數字不管多大多小,永遠佔固定的 64 個位元。
而字串是每個字元各佔 16 個位元,字越多,佔的空間就越多。
從上面的圖可以看到,字串裡的每個字元各佔一個格子,每個格子是 16 個位元。
那一個格子能裝多少種不同的字元?
16 個位元能排出 2¹⁶ = 65,536 種不同的組合,也就是說,每個格子最多能區分 65,536 種不同的字元。
這個數量看起來很多。
但 Unicode 目前定義的字元已經超過 13 萬個,大約是 65,536 的兩倍。
所以有些字元(像是許多表情符號 😀)在 JavaScript 裡會佔掉兩個字元的位置,而不是一個。
這是一個比較進階的細節,目前只要知道有這回事就好。
JavaScript 字串裡怎麼放引號和特殊字元?
問題:引號裡面要放引號怎麼辦?
假設你想要表示這段文字:他說 "你好"。
如果你用雙引號來包字串,裡面又出現雙引號,JavaScript 就會搞混——它會以為中間的雙引號是字串的結尾:
"他說 "你好"" // JavaScript 會在第二個 " 就認為字串結束了,然後報錯解法:跳脫字元(Escape Character)
為了解決這個問題,JavaScript 提供了一個特殊符號:反斜線 \。
在字串裡,只要在一個字元前面加上 \,就是告訴 JavaScript:「後面這個字元有特殊意義,不要用一般的方式處理它。」
這個做法叫做跳脫(Escaping)。
為什麼叫「跳脫」?因為它真的在描述一種「逃離原本規則」的行為。
在程式碼中,引號就像是邊界圍牆——JavaScript 看到第一個引號時會進入「字串模式」,看到下一個引號就會「結束字串」。
如果你在字串裡直接寫引號,JavaScript 會誤以為字串在那裡就結束了,後面的文字就會變成錯誤語法。
但是當你寫成 \" 時,反斜線就是在告訴 JavaScript:「後面這個引號不是結束標記,讓它逃離語法規則,當成普通文字就好。」
所以上面的問題可以這樣解決:
"他說 \"你好\"" // \" 代表「這是字串裡面的引號,不是字串的結尾」\" 裡的反斜線告訴 JavaScript:「後面這個 " 只是一般文字,不要把它當成字串結尾。」
反斜線的兩種作用
有趣的是,反斜線 \ 對不同的字元會產生相反的效果:
讓有功能的符號變普通
引號 " 原本的功能是標記字串的開頭和結尾,但加上 \ 之後,\" 就逃離了這個職責,變成一個普通的引號字元。
讓沒功能的字母變特殊
字母 n 原本只是一個普通的字母,但加上 \ 之後,\n 就逃離了字母的身分,獲得了「換行」的特殊功能。
同樣地,字母 t 加上 \ 變成 \t,就從普通字母變成了「Tab 縮排」。
這種「脫離常規」的行為,在程式裡統一稱為跳脫字元(Escape Character)。
常用的跳脫字元
除了跳脫引號,反斜線還能搭配其他字元來表示一些無法直接顯示的字元,像是「換行」或「Tab 縮排」:
舉個例子,\n 代表換行:
"第一行\n第二行"這段字串實際顯示出來會是:
第一行
第二行如果我想顯示反斜線本身呢?
既然 \ 在字串裡有特殊意義,那如果你真的想讓字串裡出現一個 \ 符號,就需要用兩個反斜線 \\:
"換行字元的寫法是 \"\\n\""這段字串實際顯示出來會是:
換行字元的寫法是 "\n"這裡的 \"\\n\" 很容易讓人誤以為中間是換行字元 \n,但其實不是。
讓我們一個一個拆開來看:
所以 \\n 其實是 \\ + n(反斜線加上字母 n),跟 \n(換行)是完全不同的東西。
JavaScript 模板字串(Template Literal)是什麼?
前面提到,字串可以用雙引號、單引號或反引號來寫。
雙引號和單引號的功能幾乎一樣,唯一的差別是:字串裡出現跟外面同一種引號時,才需要跳脫。
"他說 \"你好\"" // 外面是雙引號,裡面的雙引號要跳脫
'他說 \'你好\'' // 外面是單引號,裡面的單引號要跳脫
"他說 '你好'" // 外面是雙引號,裡面放單引號就不用跳脫
'他說 "你好"' // 外面是單引號,裡面放雙引號就不用跳脫但反引號就不一樣了。
用反引號包起來的字串,也叫做模板字串(Template Literal)。
你可能會覺得奇怪:「模板」不是像 Canva 或 PPT 那種設計好的模板嗎,跟字串有什麼關係?
其實概念是一樣的。
PPT 模板是一個設計好的框架,裡面留了幾個空位讓你填入標題和內容。
模板字串也是一樣——它是一段設計好的文字框架,裡面可以用 ${} 挖幾個空位,讓 JavaScript 自動把計算結果填進去。
另外,Literal 在程式裡的意思是「你寫什麼,它就是什麼」。
合在一起,Template Literal 就是:一個你在程式碼裡怎麼寫,最終就長什麼樣子的模板。
它有兩個雙引號和單引號做不到的特殊功能。
特殊功能一:保留原始排版,可以直接換行
就像 PPT 模板會幫你保留格式一樣,模板字串也會保留你寫的排版。
一般的雙引號或單引號字串,如果你想換行,必須用 \n:
"第一行\n第二行\n第三行"這段字串實際顯示出來會是:
第一行
第二行
第三行寫起來不太直覺,因為你沒辦法從程式碼裡一眼看出最終的排版。
但反引號的字串可以直接在程式碼裡按 Enter 換行:
`第一行
第二行
第三行`兩種寫法產生的結果一模一樣,但模板字串的寫法你一看就知道最終會長什麼樣子,不需要在腦中把 \n 轉換成換行。
特殊功能二:用 ${} 挖空填入計算結果
這是模板字串最強大的功能,也是它之所以叫「模板」的核心原因。
傳統的雙引號字串就像一塊已經燒好的磚頭,想加東西只能用 + 一段一段接:
"100 的一半是 " + (100 / 2) // 用 + 拼接,讀起來很碎模板字串則像一個填色本——你先把整段文字的結構寫好,中間用 ${} 留空位,JavaScript 會自動把計算結果填進去:
`100 的一半是 ${100 / 2}`JavaScript 會先計算 100 / 2 得到 50,然後把 50 放進字串中,最後得到:
100 的一半是 50${} 裡面可以放任何會產生值的 JavaScript 程式碼,JavaScript 都會先算完,再轉成字串塞進去。
小結
讓我們整理一下這篇文章的重點:
- 字串是用來表示文字的資料型態,用引號(雙引號
"、單引號'、反引號`)包起來。 - String 的意思是「一串字元」,就像用線串起一堆珠子。
- 字串可以用
+運算子來連接,就是把兩串珠子接在一起。 - JavaScript 用 Unicode 標準把每個字元對應到一個數字,再用 16 個位元儲存每個字元。
- 字串裡要放引號或特殊字元時,用反斜線
\來跳脫,像是\"、\n、\\。 - 反引號字串叫做模板字串(Template Literal),可以直接換行,還能用
${}嵌入計算結果。