javascript模板字面量如何使用?【教程】

JavaScript模板字面量必须用反引号包裹,支持变量插值、多行字符串及表达式计算,可配合标签函数实现XSS过滤等高级功能,但需注意缩进空格保留和引号误用问题。

JavaScript 模板字面量(template literals)不是“要不要用”的问题,而是“不用就容易写错、难维护”的现实需求——尤其在拼接多行字符串、嵌入变量或动态表达式时。

模板字面量的基本写法和反引号作用

模板字面量用反引号 ` 包裹,不是单引号或双引号。这是硬性前提,写成 '${name}'"${name}" 都不会触发插值。

常见错误现象:变量没渲染出来,输出就是字面的 ${name} ——八成是用了错的引号。

  • 正确:`Hello ${name}`
  • 错误:"Hello ${name}"(纯字符串,不解析)
  • 错误:`Hello ${name}` + '!' (混合引号易漏空格或换行)

在模板中嵌入变量和表达式

${...} 里支持任意 JavaScript 表达式,不只是变量名。这比 + 拼接灵活得多,也更安全(自动转字符串,不报 undefinednull 错误)。

使用场景:生成 HTML 片段、日志消息、SQL 查询片段(注意防注入)、路径拼接等。

  • 变量:`User: ${user.name}`
  • 方法调用:`Length: ${text.length}`
  • 三元判断:`Status: ${isActive ? 'online' : 'offline'}`
  • 对象属性链(注意空值):`Email: ${user?.email || 'N/A'}`

多行字符串与缩进处理

反引号天然支持换行,但换行符和缩进空格会原样保留在字符串中——这点常被忽略,导致生成的 HTML 或 JSON 格式错乱。

性能影响小,但可读性和调试成本高:你看到的缩进,就是最终字符串里的空格。

  • 直接换行会带空格:
    `div class="card"
      ${title}`
  • .replace(/\s+/g, ' ') 压缩空白(适合 HTML)
  • String.raw 避免转义干扰(如 Windows 路径:String.raw`C:\Users\name`

标签函数(tagged templates)的实际用途

模板字面量前面加一个函数名,比如 h

tml`${content}`,这个 html 就是标签函数。它接收静态字符串数组和插值结果作为参数,可用于 XSS 过滤、国际化、样式作用域等。

容易踩的坑:标签函数不能省略括号;它不自动执行,只是把参数传进去,逻辑全靠你写。

  • 基础签名:function html(parts, ...values) { /* parts 是 ['', ''], values 是 [content] */ }
  • 常见库用法:css`color: ${color};`(Emotion)、sql`SELECT * FROM users WHERE id = ${id}`(SQL 安全绑定)
  • 不要写成 html `${x}` 却没定义 html 函数,否则报 ReferenceError

真正难的不是语法,是意识到哪些地方该用、哪些不该用:简单拼接用 + 更轻量,复杂结构或需复用逻辑时,模板字面量+标签函数才是解法。空格缩进、嵌套层级、表达式副作用,这些细节不试几次根本记不住。