深入标签模板字面量
模板字面量是ES6引入的一个新特性,它的出现扩展了字符串的可用性,使得拼接字符串和变量变得更加方便和全面。但它不仅限于拼接字符串和变量。还可以用于进行特殊函数调用,ES6将这一功能定义为标签模板字面量。
我们看一下代码:
function tag(parts, ...values) {
return parts.reduce(
(pre, cur, index) => pre + values[index - 1] + cur);
}
let name = 'World';
let language = 'JavaScript'
let text = tag`Hello, ${name}. This is ${language}!`
console.log(text);
运行以上代码,会出现什么结果呢,你或许想到了,控制台会打印'Hello, World. This is JavaScript!'
。但你可能会感到疑惑,以上代码的运行机制是怎样的呢。下面我们就来深入了解一下标签模板字面量的运行机制。
首先,我们可以把标签模板字面量分为两部分:标签和模板字面量。如你所见,上述代码中的tag就是一个标签,即你要调用的函数。而紧跟的模板字面量就是被tag函数将要解析的传入参数。实际上,tag会将模板字面量如下解析:
tag(['Hello, ', '. This is ', '!'], 'Maurice', 'thrilled') {
...
}
终于明白了!原来标签模板字面量是这样的运行机制。首先解析所有模板字面量中的非插值内容,构成一个列表参数;然后将所有插值内容解析出来,处理为独立的参数。
标签模板还有一个更有用的用法,即可以用它来自动确保模板中插入表达式的安全性。假设有一个模板,其中所有表达式都是用户输入的内容,我们可以定义一个filter函数来移除 HTML 标签和类似的危害,从而阻止用户在网站中注入恶意的 HTML,防止跨域脚本(XSS)攻击:
function sanitized(parts, ...values) {
return parts.reduce((all, part, index) =>
all + sanitize(values[index - 1]) + part);
}
let comment = 'Evil comment<iframe src="http://evil.corp"></iframe>';
let html = sanitized`<div>${comment}</div>`;
console.log(html);
//'<div>Evil comment</div>'
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构