前端学习26 ES6 模板字符串(Template Literals)
模板字符串是ES6引入的一种新型字符串表示法,使用反引号( ` ) 包裹内容,相比传统字符串具有更强大的功能。
1.核心特性
- 多行字符串:直接支持换行。
- 字符串插值:使用 ${ 对象 } 嵌入变量和表达式。
- 标签模板:可以自定义字符串处理函数。
1.1 基本语法
// 传统字符串
const name = 'Alice';
const greeting = 'Hello, ' + name + '!';
// 模板字符串
const greeting = `Hello, ${name}!`;
1.2 多行字符串处理
// ES5实现多行字符串
var message = '第一行\n' +
'第二行\n' +
'第三行';
//ES6新特性 可以直接换行
const message = `第一行
第二行
第三行`;
1.3 字符串插值
//基本插值
const name = 'Alice';
const age = 25;
console.log(`Name: ${name}, Age: ${age}`); // "Name: Alice, Age: 25"
//表达式计算
const a = 10;
const b = 20;
console.log(`Sum: ${a + b}`); // "Sum: 30"
//函数调用
function getAge() {
return 25;
}
console.log(`Age: ${getAge()}`); // "Age: 25"
//嵌套模板
const isMember = true;
console.log(`Status: ${
isMember ? `Member since ${2020}` : 'Not a member'
}`); // "Status: Member since 2020"
1.4 标签模板(Tagged Templates)
标签模板允许使用函数解析模板字符串,第一个参数是字符串数组,后续参数是插值表达式。
function tag(strings, ...values) {
console.log(strings); // ["Hello ", "!"]
console.log(values); // ["Alice"]
return 'Processed string';
}
const name = 'Alice';
const result = tag`Hello ${name}!`;
// 当调用 tag 函数时:
// strings 参数接收模板字符串中的文本部分。
// values 参数接收模板字符串中的嵌入值。
1.5 特殊字符处理
//转义字符
console.log(`反引号: \` 美元符号: \${`); // "反引号: ` 美元符号: ${"
//原始字符串 使用String.raw 标签获取原始字符串(不处理转义字符)
const path = String.raw`C:\Development\project\files`;
console.log(path); // "C:\Development\project\files"
// 等同于
function raw(strings, ...values) {
let result = strings.raw[0];
for (let i = 0; i < values.length; i++) {
result += values[i] + strings.raw[i + 1];
}
return result;
}
1.6 性能考虑
- 静态字符串:对于纯静态字符串,模板字符串与普通字符串性能相当
- 动态插值:频繁变化的插值内容可能影响性能,在极端性能敏感场景需测试
- 标签模板:自定义处理会增加开销,但通常可忽略不计
1.7 相关实践
- 优先使用模板字符串:替代所有字符串拼接场景
- 复杂逻辑处理:对于复杂插值逻辑,考虑提前计算表达式
// 不推荐
console.log(`Result: ${calculateA() + calculateB() * complexCalculation()}`);
// 推荐
const result = calculateA() + calculateB() * complexCalculation();
console.log(`Result: ${result}`);
- 多行缩进处理:使用.trim()消除不必要的缩进
function getHtml() {
return `
<div>
<p>Content</p>
</div>
`.trim();
}
阿里云成长空间 743人发布