模板字符串是为了解决传统字符串拼接不便利而出现的。

我们先通过一个简单的例子来观察一下模板字符串与传统字符串的差别。

code.ts
1
// ES5
2
var a = 20;
3
var b = 30;
4
var string = a + "+" + b + "=" + (a + b);
5
6
// ES6
7
const a = 20;
8
const b = 30;
9
const string = `${a}+${b}=${a+b}`;

模板字符串使用反引号 [``] 将整个字符串包裹起来,变量或者表达式则使用 ${} 来包裹。

除了能够在字符串中嵌入变量,还可以用来定义多行字符串。其中所有的空格,缩进,换行都会被保留下来。

code.ts
1
var elemString = `<div>
2
<p>So you crossed the line, how'd you get that far?</p>
3
<p>${word} you give it a try.</p>
4
</div>`

${} 中,可以放入一个变量,表达式,甚至一个函数执行。

code.ts
1
// 变量
2
const hello = 'hello';
3
let message = `${hello}, world!`;
4
5
// 表达式
6
const a = 40;
7
const b = 50;
8
let result = `the result is: ${a + b}`;
9
10
// 函数
11
let fn = () => {
12
const result = 'you are the best.';
13
return result;
14
}
15
16
let str = `he said: ${fn()}`

也可以嵌套使用

code.ts
1
function isLargeScreen() {
2
return false
3
}
4
const item = {
5
isCollapsed: true
6
}
7
8
const classes = `header ${isLargeScreen() ? '' :
9
`icon-${item.isCollapsed ? 'expander' : 'collapser'}`}`;
10
11
console.log(classes)

当然还有更高级的用法。

我们可以在模板字符串前面加上一个标签。

该标签可以使用函数的形式来定义,并在内部定义更多的逻辑用于控制最终的输出。

code.ts
1
// 案例来源于 MDN
2
var person = 'Mike';
3
var age = 28;
4
5
function myTag(strings, personExp, ageExp) {
6
console.log(strings, personExp, ageExp)
7
8
var str0 = strings[0]; // "that "
9
var str1 = strings[1]; // " is a "
10
11
var ageStr;
12
if (ageExp > 99) {
13
ageStr = 'centenarian';
14
} else {
15
ageStr = 'youngster';
16
}
17
18
return str0 + personExp + str1 + ageStr;
19
20
}
21
22
var output = myTag`that ${person} is a ${age}`;
23
24
console.log(output);
25
// that Mike is a youngster

标签函数的第一个参数中,有一个特殊属性 raw,通过它可以访问模板字符串的原始字符串。

专栏首页
到顶
专栏目录