← 返回题目列表

模板字符串相比普通字符串有什么优势?

高频 简单 第 3 / 28 题 更新于 2026/07/28
ES6模板字符串字符串

简化版

模板字符串用反引号声明,支持多行文本、${} 表达式插值和标签模板,能让字符串拼接更清晰,也能承载更复杂的字符串处理逻辑。

详细版

模板字符串解决的是普通字符串拼接难读、转义多、多行文本不自然的问题。

常见能力有:

  • ${name} 插入变量或表达式。
  • 保留换行和缩进,适合写 HTML、SQL、日志模板。
  • 支持标签模板,让函数接管字符串片段和表达式值。
  • 不是自动防 XSS 的安全方案,插入用户输入时仍要做转义。

面试中要强调:模板字符串提升的是表达能力和可读性,标签模板提供的是可编程的字符串处理入口。

完整版教学

一、它先解决的是字符串拼接可读性问题

ES5 里常见写法是用 + 拼接字符串。 当变量超过 3 个、文本里又夹着引号和换行时,代码会迅速变得难读。 模板字符串把“文本骨架”和“动态数据”放在同一个语境里,读者可以直接看到最终字符串的大致形状。

const user = 'Alice';
const count = 3;

const text = `用户 ${user} 有 ${count} 条未读消息`;

上面这个例子里有 2 个动态值。 如果用普通字符串拼接,需要至少 5 段字符串和 4 个 +,维护时更容易漏空格、漏标点。 模板字符串不是性能魔法,它主要降低维护成本。

二、${} 里放的是表达式,不只是变量名

${} 中可以放变量、运算、函数调用、三元表达式等表达式。 它会先求值,再把结果转换成字符串并拼入最终文本。 因此面试时不能把模板字符串理解成简单的“变量替换语法”。

const price = 99;
const discount = 0.8;

console.log(`折后价:${price * discount}`);
console.log(`状态:${price > 50 ? '高价' : '低价'}`);

但表达式不宜写得过重。 如果 ${} 里出现 4 层嵌套或复杂业务判断,字符串会变成难维护的模板逻辑。 更好的做法是先把业务值算好,再放进模板。

三、多行文本保留换行,也会保留缩进

模板字符串天然支持多行文本。 这对生成 HTML 片段、日志、GraphQL 查询、SQL 片段很方便。 需要注意的是:你在源码里写下的换行和空格,很多情况下都会成为字符串的一部分。

const html = `
  <section>
    <h2>Title</h2>
  </section>
`;

这个字符串开头有 1 个换行,内部每行还带缩进。 如果把它用于精确比较、签名计算或协议报文,额外空白可能导致结果不同。 例如长度可能不是肉眼看到的 38,而是包含换行与空格后的更大数值。

四、标签模板让函数接管字符串处理

标签模板的写法是 tag\hello ${name}“。 这里不是先拼完字符串再传给函数,而是把静态片段数组和表达式值分别传入标签函数。 这让函数可以做转义、国际化、SQL 参数化、样式处理等工作。

function tag(strings, ...values) {
  console.log(strings);
  console.log(values);
}

tag`a=${1}, b=${2}`;
// strings: ["a=", ", b=", ""]
// values: [1, 2]

流程可以理解为:

源码模板
  -> 拆成静态字符串片段
  -> 计算每个表达式
  -> 调用 tag(strings, ...values)
  -> 返回标签函数的结果

标签函数返回值不一定是字符串。 它可以返回对象、数组,甚至返回一个渲染函数。

五、模板字符串不是安全边界

很多同学会误以为用了模板字符串就更安全。 事实上模板字符串只是语法,它不会自动转义 HTML,也不会阻止脚本注入。 如果用户输入直接拼进 HTML,再通过 innerHTML 渲染,风险依然存在。

场景是否安全原因
textContent = \${name}“较安全浏览器按文本处理
innerHTML = \${name}有风险用户输入会进入 HTML 解析
标签模板统一 escape取决于实现安全性来自标签函数,不来自语法

记住:模板字符串负责“好写”,安全来自上下文转义和可信边界,不来自反引号。

六、常见误区与追问

  • 误区:模板字符串一定比字符串拼接性能好。 大多数业务场景差异很小,选择它主要是为了可读性;热点循环里仍应以真实性能测试为准。
  • 误区:${} 只能写变量。 里面可以写表达式,但复杂逻辑应提前计算,避免模板变成业务代码。
  • 误区:多行模板不会包含源码缩进。 换行和空格通常会进入字符串,做精确比较或协议拼接时要特别小心。
  • 追问:标签模板和普通函数调用有什么区别? 标签模板拿到的是静态字符串片段和表达式值的分离结构,可以在拼接前做转义、参数化或转换。
  • 追问:模板字符串能不能防 XSS? 不能;只有在正确上下文中转义,或使用安全的标签函数,才可能降低注入风险。
  • 追问:为什么标签模板适合做 SQL 参数化? 因为静态 SQL 片段和值是分开的,库可以把值作为参数绑定,而不是直接拼进 SQL 文本。

七、加强记忆

把模板字符串记成三层能力:第一层是反引号带来的多行文本,第二层是 ${} 带来的表达式插值,第三层是标签模板带来的可编程处理。回答时先说可读性,再说多行和表达式,最后补一句安全边界:反引号不负责转义,真正的安全要看输出上下文和标签函数实现。