JavaScript ES6 模板字符串详解:基础用法与标签模板

作者:纸飞机时间:2026-10-30 20:37:40浏览:117

本文详细介绍 JavaScript ES6 引入的模板字符串(Template String)功能。涵盖使用反引号定义字符串、嵌入变量表达式、处理多行文本及转义字符。重点解析“标签模板”机制,包括参数传递规则、String.raw 方法的原始字符串处理以及实际应用场景。

模板字符串(Template String)是 ES6 中增强版的字符串类型,使用反引号(`)进行标识。它既可作为普通字符串使用,也支持定义多行字符串以及在字符串内部嵌入变量。

用法

用法

// 普通字符串
`In JavaScript '\n' is a line-feed.`
// 多行字符串
`In JavaScript this is
not legal.`
// 字符串中嵌入变量
var name = "Bob", time = "today";
`Hello ${name}, how are you ${time}?`   // Hello Bob, how are you today?

在上述代码示例中,模板字符串均通过反引号表示。若需在模板字符串内部使用反引号字符,必须在前添加反斜杠(\)进行转义处理。

var greeting = `\`Yo\` World!`; // `Yo` World!

当使用模板字符串表示多行字符串时,输出结果将保留所有的空格、缩进以及换行符。

$('#list').html(`
<ul>
  <li>first</li>
  <li>second</li>
</ul>
`);

前述代码表明,模板字符串中的空格与换行均被保留。例如,在 <ul> 标签前会存在一个换行符。若需去除首尾的换行和空格,可调用 trim 方法处理。

$('#list').html(`
<ul>
  <li>first</li>
  <li>second</li>
</ul>
`.trim());

在模板字符串中嵌入变量时,需将变量名置于 ${} 符号内。大括号内部可放置任意 JavaScript 表达式,包括执行运算或访问对象属性。

var x = 1, y = 2;
`${x} + ${y} = ${x + y}`;
// "1 + 2 = 3"
`${x} + ${y * 2} = ${x + y * 2}`;
// "1 + 4 = 5"
var obj = {x: 1, y: 2};
`${obj.x + obj.y}`
// "3"

模板字符串内部同样支持调用函数。

function func() {
    return 'Hello';
}
`${func()} World`;
// "Hello World"

若大括号内的值非字符串类型,系统将按常规规则将其转换为字符串。例如,若大括号内为对象,则默认调用该对象的 toString 方法以转换为字符串。

若模板字符串中引用的变量尚未声明,程序将抛出错误。

// 变量place没有声明
var msg = `Hello, ${place}`;
// ReferenceError: place is not defined

模板字符串支持相互嵌套使用。

var tmpl = addrs => `
    <table>
    ${addrs.map(addr => `
        <tr><td>${addr.first}</td></tr>
        <tr><td>${addr.last}</td></tr>
    `).join('')}
    </table>
`;
tmpl([{first:'a', last: 'b'}]);
// output:
/*"
    <table>
        <tr><td>a</td></tr>
        <tr><td>b</td></tr>
    </table>
"*/

若需引用模板字符串本身并在需要时执行,可采用如下写法。

// 写法一
var str = 'return ' + '`Hello ${name}!`';
var func = new Function('name', str);
func('Amy');    // "Hello Amy!"
// 写法二
var str = '(name) => `Hello ${name}!`';
var func = eval.call(null, str);
func('Amy');    // "Hello Amy!"

标签模板

模板字符串的功能不仅限于上述内容,它还可紧跟在一个函数之后。该函数将被调用以处理此模板字符串,此机制被称为“标签模板”(Tagged template)。

在标签模板函数中,第一个参数为包含模板字符串常量部分的数组,后续每个参数分别为对应表达式的计算结果。函数名称可任意指定。示例如下:

var a = 5, b = 10;
function tag(strings, ...values) {
    console.log(strings[0]);    // "Hello "
    console.log(strings[1]);    // " world"
    console.log(strings[2]);    // ""
    console.log(values[0]);     // 15
    console.log(values[1]);     // 50
    return "Anything";
}
tag`Hello ${a + b} world ${a * b}`;
// Anything
alert`123`
// 等同于
alert(123)

标签模板实质是一种特殊的函数调用形式,“标签”即指代该函数,紧随其后的模板字符串作为其参数。

var a = 1,
    b = 2;
tag`Helo ${a + b} world ${a * b}`;

前述代码中,模板字符串前存在标识名 tag,其为一个函数。整个表达式的返回值即为 tag 函数处理模板字符串后的结果。

函数 tag 依次接收多个参数。

function tag(stringArr, value1, value2) {
    // ...
}
// 等同于
function tag(stringArr, ...values) {
    // ...
}

tag 函数的第一个参数是一个数组,其成员为模板字符串中未被变量替换的部分。换言之,变量替换仅发生在数组第一个与第二个成员之间、第二个与第三个成员之间,依此类推。

tag 函数的其余参数均为模板字符串中各变量被替换后的值。本例中,模板字符串包含两个变量,因此 tag 接收 value1 和 value2 两个参数。

tag 函数所有参数的实际值如下:

  • 第一个参数: [‘Hello ‘, ’ world’, ”]
  • 第二个参数: 3
  • 第三个参数: 2

也就是说,tag 函数实际上是以以下形式被调用:

tag(['Hello ',' world', ''], 3, 2);

String对象的raw方法

String.raw 方法用作模板字符串的处理函数,返回一个字符串,其中表达式和变量已被替换,其余部分保持原样。

关于 String.raw 的详细用法,可参考此链接:https://www.jb51.net/article/250856.htm

String.raw`Hi\n${2+3}!`;
// "Hi\n5!"
String.raw`Hi\u000A!`;
// "Hi\u000A!"
String.rwa`Hi\\n`;
// "Hi\\n"

String.raw 方法可作为处理模板字符串的基础方法,它执行所有变量替换,并对斜杠进行转义,便于后续作为字符串使用。

至此,关于 JavaScript ES6 模板字符串(Template String)使用方法的介绍完毕。如需了解更多 JS Template String 相关内容,请搜索本站历史文章或继续浏览后续相关文章,感谢支持!

作者最新文章