带标签的模板字面量是JavaScript高级特性,通过函数拦截模板字符串解析,接收静态字符串数组和动态插值值,支持安全转义、i18n、CSS封装等;基础写法为fnhello ${name}。
JavaScript 模板字符串本身不支持“模板字符串标签”这种独立语法,但你提到的其实是带标签的模板字面量(Tagged Template Literals)——这是模板字符串的一个高级特性,允许你用函数“拦截”模板字符串的解析过程,实现动态处理、安全转义、国际化、样式封装等能力。
标签模板就是在模板字符串前加一个函数名,不带括号,形如 fn`hello ${name}`。JS 会把模板拆解为静态字符串数组和动态插值表达式,再一起传给函数:
`a${1}b${2}c` → ["a", "b", "c"]
1, 2
直接拼接用户输入易导致 XSS。用标签函数自动转义插值内容,就能兼顾可读性与安全性:
示例:简易 HTML 转义标签function html(strings, ...values) {
return strings.reduce((acc, str, i) => {
const val = values[i] ?? '';
const escaped = typeof val === 'string'
? val.replace(/[&<>"']/g, c => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c]))
: String(val);
return acc + str + escaped;
}, '');
}
const user = '';
document.innerHTML = html`Hello ${user}!`; // 安全渲染,不会执行脚本
标签函数可以结合上下文做运行时翻译或 CSS 处理:
m
sg`Welcome, ${name}!`)开发中容易忽略的细节:
strings 数组长度恒为 values.length + 1,末尾无插值时最后一个元素为空字符串String.raw 配合标签函数处理原始字符串(如正则、路径),避免转义干扰@babel/plugin-transform-tagged-template-literal)