在编程的世界中,有时候回归基础反而能带来新的发现。最近,观看了一系列面向初学者的JavaScript视频,以判断它们是否适合儿子学习JavaScript。在这个过程中,意外地学到了一些新东西,尽管已经断断续续地使用JavaScript多年,但之前从未意识到它的威力,只是把它当作定义字符串的另一种方式。
模板字面量实际上只是字符串的一个花哨名称,它允许进行字符串插值(这本身也是一个花哨的术语,意味着允许将变量替换到字符串中)。例如,像这样的一个语句:
const name = 'Frank';
console.log('Hello, ' + name + '. Pleased to meet you!');
使用模板字面量可以写成这样:
const name = 'Frank';
console.log(`Hello, ${name}. Pleased to meet you!`);
在这个例子中,模板字面量需要使用反引号字符包围字符串,任何被${<符号>}包围的内容在字符串使用时都会被插值。
好的,可能会想,这有什么用呢?毕竟,上面的示例并不难理解。首先,想象一个更复杂的例子。例如,假设需要使用输入变量构建路径:
const root = 'c:';
const programs = 'program files';
const appfolder = 'my application';
console.log('The path is \'' + root + '\\' + programs + '\\' + appfolder + '\'');
与此相比:
const root = 'c:';
const programs = 'program files';
const appfolder = 'my application';
console.log(`The path is '${root}\\${programs}\\${appfolder}'`);
使用模板字面量看起来更自然,更容易看出引号和空格如何在输出字符串中出现。
另一个不错的特性是,由模板字面量插值的字符串本身可以是模板字面量字符串:
const name = 'Frank';
const greeting = `Hello, ${name}. Pleased to meet you!`;
console.log(`Computer says: ${greeting}`);
输出结果为:
Computer says: Hello, Frank. Pleased to meet you!
还可以编写模板字面量内的表达式:
const a = 5;
const b = 1;
const c = 13;
console.log(`The perimeter of the triangle is: ${a + b + c}`);
输出结果为:
The perimeter of the triangle is: 19
模板字面量的真正威力在处理多行字符串时变得显而易见。当在JavaScript中编写多行字符串时,要么必须通过关闭字符串来连接每一行,要么使用反斜杠:
console.log('Please enter your choice: \n1. Pepperoni \n2. Sausage \n3. Mushroom \n');
即使使用这种格式,它可能不会按照预期的方式打印,看这个例子,可能期望每个选择都在它自己的一行,但实际上会看到:
Please enter your choice: 1. Pepperoni 2. Sausage 3. Mushroom
使用模板字面量,可以这样编写这个例子:
console.log(`Please enter your choice:\n1. Pepperoni\n2. Sausage\n3. Mushroom\n`);
Please enter your choice:
1. Pepperoni
2. Sausage
3. Mushroom