为什么说 String 是 JavaScript 中“最安静却最危险”的类型



大家好,我是 31 岁、爱折腾代码、也爱把技术讲成故事的小米。

如果你写 JavaScript 的时间够久,一定会有一种感觉:

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

我们天天在用它,却很少认真"聊一聊它"。于是有一天,我在敲代码的时候突然脑补了一个画面:

String 不是字符串,它是一个庞大的"文字王国"。

今天这篇文章,我就带你跟着我,一起走进 JavaScript 的文字王国,看看 String 这个"老朋友",到底藏了多少你可能没认真想过的秘密。

字符字面量:文字王国的"入口大门"

故事要从"进城"说起。在 JavaScript 里,只要你想进入文字王国,就必须从字符字面量这几扇大门进去。

1、三种最常见的字符字面量

在 JS 里,字符串可以用:

  • 双引号 "
  • 单引号 '
  • 反引号 `(模板字面量)

我第一次学 JS 的时候,特别纠结: "老师,到底用单引号还是双引号?"

后来工作几年才发现:JavaScript 本身不在乎,项目规范才在乎。

2、转义字符:城门的"暗号"

如果你想在字符串里放一些"特殊角色",就得用转义字符。

常见转义字符对照表:

在文字王国里,反斜杠就像"通行证",告诉 JS:后面这个字符别按原来的意思理解。

字符串的特点:文字王国的"基本国法"

进了城,总要先了解这个国家的基本规则。

1、字符串是"不可变的"

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

你以为你在改字符串,实际上 JS 在心里冷冷地对你说了一句:"对不起,本国不支持原地修改。"

你真正能做的,只是创建一个新字符串

字符串就像一块已经烤好的蛋糕,你不能从中间挖一块再塞回去,你只能重新烤一块新的。

2、字符串有 length,但不是数组

很多新人一看到 str[0],就误以为字符串是数组。

错。 字符串只是 "像数组一样可读" ,但本质不是数组。

转换为字符串:跨国公民的"身份转换"。

在文字王国里,经常会有"外来人口",比如:数字、布尔值、对象......他们想进城,就必须变成字符串

1、使用 String()

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

2、使用 toString()

但要注意:

3、经验总结

4、隐式转换(不推荐但你一定见过)

这是 JS 在背后偷偷做的事情。小米的忠告是:面试可以说,代码里少用。

模板字面量:文字王国的"高级语法"

ES6 之后,文字王国迎来了一次"技术革命"。

1、模板字面量登场

你第一次用模板字面量时,一定会有一种感觉:"以前那堆 + 拼字符串的日子,终于结束了。"

2、支持多行字符串

不用 \n,不用拼接,写什么样,就是什么样。

字符串插值:让字符串"活起来"

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

${} 里:

  • 可以写变量
  • 可以写表达式
  • 可以写函数调用

本质理解

字符串插值不是"拼接字符串",而是 "在字符串里执行 JavaScript 表达式"。

模板字面量标签函数:文字王国的"翻译官"

接下来这一部分,是很多人见过,但没用过,也没搞懂的高级玩法

1、什么是标签函数?

输出结果:

解释一下

  • strings:被 ${} 分割后的字符串数组
  • values:插值表达式的值

2、标签函数能干嘛?

示例:防止 XSS

现实意义

  • 模板引擎
  • SQL 构建
  • XSS 防护
  • 国际化文本处理

可以理解为:标签函数 = 字符串的"预处理器"。

原始字符串:不被转义的"原貌文本"

最后一个点,非常细,但非常有用。

1、什么是原始字符串?

String.raw 会保留字符串的原始内容

2、使用场景

适合:

  • 正则表达式
  • Windows 路径
  • 需要精确字符的场景

一句话总结

原始字符串,就是"我写什么,你就给我什么"。

总结:String 不简单,只是你太熟了

写到这里,小米想说一句掏心窝子的:

String 是 JavaScript 里最基础的类型之一,也是最容易被低估的类型之一。

你天天在用它,但真正理解它的不可变性、模板能力、标签函数之后,你会发现:

  • 代码更优雅
  • 思路更清晰
  • 面试也更有底气

END

我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号"软件求生",获取更多技术干货!

好朋友们,我们下篇见。

相关推荐
wusp19942 小时前
【超完整】Tailwind CSS 实战教程
前端·css·tailwind
南山安2 小时前
React 学习:父传子的单项数据流——props
javascript·react.js·前端框架
jun_不见2 小时前
nest初体验-用nest实现一个简单的CRUD功能
前端·node.js·全栈
这个需求建议不做2 小时前
pdf.js(pdfdist)踩坑workerSrc报错pdf.worker.mjs无法正确获取
开发语言·javascript·pdf
soda_yo2 小时前
React哲学:保持组件纯粹 哈气就要哈得纯粹
前端·react.js·设计
Bigger2 小时前
Tauri (22)——让 `Esc` 快捷键一层层退出的分层关闭方案
前端·react.js·app
大猫会长2 小时前
react中用css加载背景图的2种情况
开发语言·前端·javascript
子春一22 小时前
Flutter 2025 可访问性(Accessibility)工程体系:从合规达标到包容设计,打造人人可用的无障碍应用
javascript·flutter·microsoft
专业IT有讠果2 小时前
[Docker/K8S] Kubernetes故障克星:19个高频问题速查与秒解指南(2025版)
javascript·面试