模板字符串是为了解决传统字符串拼接不便利而出现的。
我们先通过一个简单的例子来观察一下模板字符串与传统字符串的差别。
1// ES52var a = 20;3var b = 30;4var string = a + "+" + b + "=" + (a + b);56// ES67const a = 20;8const b = 30;9const string = `${a}+${b}=${a+b}`;
模板字符串使用反引号 [``]
将整个字符串包裹起来,变量或者表达式则使用 ${}
来包裹。
除了能够在字符串中嵌入变量,还可以用来定义多行字符串。其中所有的空格,缩进,换行都会被保留下来。
1var 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>`
${}
中,可以放入一个变量,表达式,甚至一个函数执行。
10// 变量20const hello = 'hello';30let message = `${hello}, world!`;4050// 表达式60const a = 40;70const b = 50;80let result = `the result is: ${a + b}`;9010// 函数11let fn = () => {12const result = 'you are the best.';13return result;14}1516let str = `he said: ${fn()}`
也可以嵌套使用
10function isLargeScreen() {20return false30}40const item = {50isCollapsed: true60}7080const classes = `header ${isLargeScreen() ? '' :90`icon-${item.isCollapsed ? 'expander' : 'collapser'}`}`;1011console.log(classes)
当然还有更高级的用法。
我们可以在模板字符串前面加上一个标签。
该标签可以使用函数的形式来定义,并在内部定义更多的逻辑用于控制最终的输出。
10// 案例来源于 MDN20var person = 'Mike';30var age = 28;4050function myTag(strings, personExp, ageExp) {60console.log(strings, personExp, ageExp)7080var str0 = strings[0]; // "that "90var str1 = strings[1]; // " is a "1011var ageStr;12if (ageExp > 99) {13ageStr = 'centenarian';14} else {15ageStr = 'youngster';16}1718return str0 + personExp + str1 + ageStr;1920}2122var output = myTag`that ${person} is a ${age}`;2324console.log(output);25// that Mike is a youngster
标签函数的第一个参数中,有一个特殊属性 raw
,通过它可以访问模板字符串的原始字符串。