大家好,我是 31 歲、愛折騰代碼、也愛把技術講成故事的小米。

如果你寫 JavaScript 的時間夠久,一定會有一種感覺:

JS 裏最熟悉、用得最多、但又最容易被忽略的類型,就是 String。

我們天天在用它,卻很少認真“聊一聊它”。於是有一天,我在敲代碼的時候突然腦補了一個畫面:

String 不是字符串,它是一個龐大的“文字王國”。

今天這篇文章,我就帶你跟着我,一起走進 JavaScript 的文字王國,看看 String 這個“老朋友”,到底藏了多少你可能沒認真想過的秘密。

字符字面量:文字王國的“入口大門”

故事要從“進城”説起。在 JavaScript 裏,只要你想進入文字王國,就必須從字符字面量這幾扇大門進去。

1、三種最常見的字符字面量

為什麼説 String 是 JavaScript 中“最安靜卻最危險”的類型_字符串

在 JS 裏,字符串可以用:

  • 雙引號 "
  • 單引號 '
  • 反引號 `(模板字面量)

我第一次學 JS 的時候,特別糾結:“老師,到底用單引號還是雙引號?”

後來工作幾年才發現:JavaScript 本身不在乎,項目規範才在乎。

2、轉義字符:城門的“暗號”

如果你想在字符串裏放一些“特殊角色”,就得用轉義字符。

為什麼説 String 是 JavaScript 中“最安靜卻最危險”的類型_插值_02

常見轉義字符對照表:

為什麼説 String 是 JavaScript 中“最安靜卻最危險”的類型_字符串_03

在文字王國裏,反斜槓就像“通行證”,告訴 JS:後面這個字符別按原來的意思理解。

字符串的特點:文字王國的“基本國法”

進了城,總要先了解這個國家的基本規則。

1、字符串是“不可變的”

這是 String 最重要、也是最容易被忽略的一點:字符串一旦創建,就不可被修改。

為什麼説 String 是 JavaScript 中“最安靜卻最危險”的類型_字面量_04

你以為你在改字符串,實際上 JS 在心裏冷冷地對你説了一句:“對不起,本國不支持原地修改。”

你真正能做的,只是創建一個新字符串

為什麼説 String 是 JavaScript 中“最安靜卻最危險”的類型_插值_05

字符串就像一塊已經烤好的蛋糕,你不能從中間挖一塊再塞回去,你只能重新烤一塊新的。

2、字符串有 length,但不是數組

為什麼説 String 是 JavaScript 中“最安靜卻最危險”的類型_插值_06

很多新人一看到 str[0],就誤以為字符串是數組。

錯。字符串只是“像數組一樣可讀”,但本質不是數組。

為什麼説 String 是 JavaScript 中“最安靜卻最危險”的類型_字面量_07

轉換為字符串:跨國公民的“身份轉換”。

在文字王國裏,經常會有“外來人口”,比如:數字、布爾值、對象……他們想進城,就必須變成字符串

1、使用 String()

為什麼説 String 是 JavaScript 中“最安靜卻最危險”的類型_字面量_08

這是最安全、最通用的方式。

2、使用 toString()

為什麼説 String 是 JavaScript 中“最安靜卻最危險”的類型_字符串_09

但要注意:

為什麼説 String 是 JavaScript 中“最安靜卻最危險”的類型_插值_10

3、經驗總結

為什麼説 String 是 JavaScript 中“最安靜卻最危險”的類型_字面量_11

4、隱式轉換(不推薦但你一定見過)

為什麼説 String 是 JavaScript 中“最安靜卻最危險”的類型_字符串_12

這是 JS 在背後偷偷做的事情。小米的忠告是:面試可以説,代碼裏少用。

模板字面量:文字王國的“高級語法”

ES6 之後,文字王國迎來了一次“技術革命”。

1、模板字面量登場

為什麼説 String 是 JavaScript 中“最安靜卻最危險”的類型_字面量_13

你第一次用模板字面量時,一定會有一種感覺:“以前那堆 + 拼字符串的日子,終於結束了。”

2、支持多行字符串

為什麼説 String 是 JavaScript 中“最安靜卻最危險”的類型_插值_14

不用 \n,不用拼接,寫什麼樣,就是什麼樣。

字符串插值:讓字符串“活起來”

模板字面量真正的靈魂,是字符串插值

為什麼説 String 是 JavaScript 中“最安靜卻最危險”的類型_插值_15

${} 裏:

  • 可以寫變量
  • 可以寫表達式
  • 可以寫函數調用

為什麼説 String 是 JavaScript 中“最安靜卻最危險”的類型_字面量_16

本質理解

字符串插值不是“拼接字符串”,而是 “在字符串裏執行 JavaScript 表達式”。

模板字面量標籤函數:文字王國的“翻譯官”

接下來這一部分,是很多人見過,但沒用過,也沒搞懂的高級玩法

1、什麼是標籤函數?

為什麼説 String 是 JavaScript 中“最安靜卻最危險”的類型_字符串_17

輸出結果:

為什麼説 String 是 JavaScript 中“最安靜卻最危險”的類型_字面量_18

解釋一下

  • strings:被 ${} 分割後的字符串數組
  • values:插值表達式的值

2、標籤函數能幹嘛?

示例:防止 XSS

為什麼説 String 是 JavaScript 中“最安靜卻最危險”的類型_插值_19

現實意義

  • 模板引擎
  • SQL 構建
  • XSS 防護
  • 國際化文本處理

可以理解為:標籤函數 = 字符串的“預處理器”。

原始字符串:不被轉義的“原貌文本”

最後一個點,非常細,但非常有用。

1、什麼是原始字符串?

為什麼説 String 是 JavaScript 中“最安靜卻最危險”的類型_插值_20

String.raw 會保留字符串的原始內容

2、使用場景

為什麼説 String 是 JavaScript 中“最安靜卻最危險”的類型_字面量_21

適合:

  • 正則表達式
  • Windows 路徑
  • 需要精確字符的場景

一句話總結

原始字符串,就是“我寫什麼,你就給我什麼”。

總結:String 不簡單,只是你太熟了

寫到這裏,小米想説一句掏心窩子的:

String 是 JavaScript 裏最基礎的類型之一,也是最容易被低估的類型之一。

你天天在用它,但真正理解它的不可變性、模板能力、標籤函數之後,你會發現:

  • 代碼更優雅
  • 思路更清晰
  • 面試也更有底氣

END

我是小米,一個喜歡分享技術的31歲程序員。如果你喜歡我的文章,歡迎關注我的微信公眾號“軟件求生”,獲取更多技術乾貨!

好朋友們,我們下篇見。