模板字符串:告别字符串拼接地狱

JavaScript 模板字符串不只是为了少写几个加号,它在多行文本、表达式嵌入以及标签模板上的威力,能极大地提升你的开发体验。

5 分钟阅读
小明

模板字符串:告别字符串拼接地狱

在 ES6 出现之前,如果你想在 JavaScript 里拼一段带变量的 HTML,那简直是一场噩梦。

// ❌ 过去:到处都是引号和加号
var name = '小明';
var age = 25;
var html = '<div class="user">' +
           '<h1>' + name + '</h1>' +
           '<p>年龄:' + age + '</p>' +
           '</div>';

只要少写一个 + 或者漏掉一个单引号,整个代码就会崩掉。更别提那种看一眼就让人眼花缭乱的层级嵌套了。

幸运的是,我们有了模板字符串(Template Literals)。今天,小明就带你看看这个被称为“拯救前端审美”的特性。


一、基础语法:反引号的力量

模板字符串使用反引号( ` )而不是单双引号。

1.1 变量嵌入

通过 ${expression} 语法,你可以直接在字符串里插入任何变量或表达式。

// ✅ 现在:清爽利落
const name = '小明';
const age = 25;
const html = `
  <div class="user">
    <h1>${name}</h1>
    <p>年龄:${age}</p>
  </div>
`;

1.2 多行文本

看到了吗?上面的代码直接换行了!在普通字符串里,换行需要写 \n,但在模板字符串里,你看到的换行就是真正的换行。这在写 SQL 语句或者 HTML 模板时非常方便。


二、不只是变量

${} 里面不仅可以放变量,还可以放任何有效的 JavaScript 表达式

2.1 数学运算

const price = 100;
const tax = 0.1;
console.log(`总价是:${price * (1 + tax)}`);

2.2 函数调用

function sayHi() { return '你好!'; }
console.log(`系统消息:${sayHi()}`);

2.3 三元运算符

const isLogin = true;
console.log(`状态:${isLogin ? '已登录' : '未登录'}`);

三、进阶:标签模板(Tagged Templates)

这才是模板字符串最硬核的玩法。你可以在模板字符串前面加一个函数名,这个函数会自动接收解析后的字符串和变量。

function highlight(strings, ...values) {
  // strings: 被 ${} 分割后的字符串数组
  // values: ${} 里的值
  return strings.reduce((prev, curr, i) => {
    return `${prev}${curr}<span class="highlight">${values[i] || ''}</span>`;
  }, '');
}

const name = '小明';
const result = highlight`欢迎 ${name} 来到我的主页`;
// 结果:'欢迎 <span class="highlight">小明</span> 来到我的主页'

为什么这个很有用? 流行的 CSS-in-JS 库 styled-components 和 SQL 防注入库,底层都是基于这个原理实现的。


四、注意事项

  1. 转义:如果你想在模板字符串里写一个真正的 ${,你需要转义:\$\{
  2. 性能:在大多数场景下,模板字符串和普通拼接性能没区别。但在极端的高频循环里,简单的加号拼接可能会稍微快那么一点点(但通常可以忽略不计)。

总结

  1. 反引号定义,${} 嵌入。
  2. 支持多行文本,保留所有空格和换行。
  3. 可以嵌入复杂表达式
  4. 标签模板是构建高级库的基石。

小明建议: 只要涉及到字符串和变量的混合,无脑使用模板字符串。它不仅让代码更易读,还能有效减少拼写错误导致的 Bug。


“为什么模板字符串用反引号?” “因为单引号和双引号已经为了谁才是正统打得不可开交了,反引号决定渔翁得利。” —— 小明

最后,送你一个冷笑话: 字符串 A 问字符串 B :“你最近怎么变胖了?” 字符串 B 叹了口气:“别提了,自从用了模板字符串,我肚子里塞的东西(变量)越来越多了。”