目录
模板字符串是 ES6 引入的一项重要特性,它不仅解决了传统字符串拼接的痛点,还带来了强大的标签模板功能。本文将深入探讨模板字符串的高级用法,包括多行字符串处理、标签模板的实现原理、实际应用场景以及性能考量。
1. 模板字符串基础回顾
1.1 基本语法
模板字符串使用反引号(`
)包裹,支持嵌入表达式和换行:
const name = 'Alice';
const age = 28;
// 传统字符串拼接
const str1 = 'My name is ' + name + ', age is ' + age;
// 模板字符串
const str2 = `My name is ${
name}, age is ${
age}`;
1.2 核心特性对比
特性 | 传统字符串 | 模板字符串 |
---|---|---|
换行支持 | 需要\n |
直接支持 |
变量插值 | 需要+ 拼接 |
${} 语法 |
标签功能 | 不支持 | 支持 |
HTML 转义 | 手动处理 | 可通过标签模板实现 |
性能 | 较高 | 稍低但可优化 |
2. 多行字符串的高级应用
2.1 基础多行字符串
// 传统方式
const oldMultiline = '第一行\n' +
'第二行\n' +
'第三行';
// 模板字符串方式
const newMultiline = `第一行
第二行
第三行`;
2.2 缩进处理技巧
多行字符串会保留所有空白字符,有时需要处理缩进:
function dedent(str) {
const lines = str.split('\n');
const minIndent = lines.filter(s => s.trim())
.reduce((min, line) => {
const indent = line.match(/^\s*/)[0].length;
return Math.min(min, indent);
}, Infinity);
return lines.map(line => line.slice(minIndent)).join('\n');
}
const indentedString = `
<div>
<p>Hello World</p>
</div>
`;
console.log(dedent(indentedString));
// <div>
// <p>Hello World</p>
// </div>
2.3 多行字符串的实际应用
2.3.1 SQL 查询构建
const userId = 123;
const query = `
SELECT * FROM users
WHERE id = ${
userId}
AND status = 'active'
`;
2.3.2 HTML 模板生成
const items = ['Apple', 'Banana', 'Orange'];
const html = `
<ul>
${
items.map(item => `<li>${
item}</li>`).join('')}
</ul>
`;
3. 标签模板深入解析
3.1 基本概念
标签模板是一种特殊的函数调用语法:
function tag(strings, ...values) {
// 处理逻辑
}
const name = 'Alice';
const age = 28;
tag`My name is ${
name}, age is ${
age}`;
3.2 参数解析
标签函数接收两个参数:
strings
: 模板字符串的静态部分数组...values
: 插值表达式的计算结果数组