语法

模板字符串(Template String)是增强版的字符串,用反引号(`)标识,它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。

用法

// 普通字符串
`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]);     // 15console.log(values[1]);     // 50return "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`Hi\n${2+3}!`;
// "Hi\n5!"String.raw`Hi\u000A!`;
// "Hi\u000A!"String.rwa`Hi\\n`;
// "Hi\\n"

String.raw方法可以作为处理模板字符串的基本方法,它会将所有变量替换,而且对斜杠进行转义,方便下一步作为字符串来使用。

ES6 Template String 模板字符串相关推荐

  1. [译]JavaScript:ES6中的模板字符串简介

    原文:http://tc39wiki.calculist.org/es6/template-strings/ ES6中的模板字符串(template string)是一种能在字符串文本中内嵌表达式的字 ...

  2. ES6学习(模板字符串)

    模板字符串 传统的JavaScript语言,输出模板通常是这样写的. const name = 'Jack'; const age = 18; const sentence = name + ' is ...

  3. es6字符串添加html标签,JavaScript_详解JavaScript ES6中的模板字符串,在 ES6 中引入了一种新的字符 - phpStudy...

    详解JavaScript ES6中的模板字符串 在 ES6 中引入了一种新的字符串字面量 - 模板字符串,除了使用反引号 (`) 表示,它们看上去和普通的字符串没有什么区别.在最简单的情况下,他们就是 ...

  4. js模板字符串自定义类名_详解JavaScript ES6中的模板字符串

    这篇文章主要介绍了详解JavaScript ES6中的模板字符串,JS的ES6版本带来诸多简洁化方面的重大改进,需要的朋友可以参考下 在 ES6 中引入了一种新的字符串字面量 - 模板字符串,除了使用 ...

  5. ES6新功能-模板字符串

    ES6新功能-模板字符串 VS 传统JS字符串拼接

  6. ES6知识点整理模板字符串和标签模板的应用

    ES6 中对字符串进行了扩展,而模板字符串就是一个非常实用的方式,可以在html中实现与变量和方法的混编 之前我们手动拼接字符串的方式 let hello = 'Hello'; let html = ...

  7. 【ES6】阮一峰ES6学习(二)模板字符串、新增的字符串方法、函数扩展、rest参数、箭头函数

    模板字符串 // 普通字符串 `In JavaScript '\n' is a line-feed.`// 多行字符串 `In JavaScript this isnot legal.`console ...

  8. ES6折腾记-模板字符串

    前言 模板字符串是个好东西,请看我细细道来: 模板字符串 模板字符串是ES6引进来的,有点类似我们平时使用的模板引擎[jade,handlebar这些], 但功能相对鸡肋些,无法条件循环遍历什么的,下 ...

  9. ES6中的模板字符串---反引号``

    在react中,反引号``有特殊的含义. 如MDN中所述,模板字符串(Template literals)允许嵌入表达式,并且支持多行字符串和字符串插补特性.基本语法为以下几种: 其中第一行为最基本用 ...

最新文章

  1. flume bucketpath的bug一例
  2. iangularjs 模板,AngularJS模板中的三元运算符
  3. mysql单实例多数据库_Mysql单实例数据库的安装
  4. java 抽象类和接口1--基本概念
  5. 谷歌修复多个严重的安卓 RCE 漏洞
  6. tf.nn.embedding_lookup,tf.variable系列变量
  7. 百度旋转验证码打码模块,集成鱼刺模块类
  8. 一张程序员人生图,很有意思
  9. 傅里叶分析之掐死教程(完整版)更新于2014.06.06
  10. MATLAB学习笔记之矩阵和数组1.1(mathematic)
  11. EasyPusher手机直播推送是如何实现后台直播推送的
  12. 电脑蓝屏critical_process_died,重装win10遇到的问题
  13. Python基础1——导入文件数据
  14. js中[object,object]是什么,怎么取值
  15. 如何彻底卸载最新版的edge?
  16. 浮动按钮FloatingActionButton
  17. 【WebSocket】WebSocket学习笔记
  18. 基于Hutools图片上传下载
  19. Python3.6.1 AES/ECB/padding PKCS5 方法的加密解密脚本实现
  20. 唯品会三年,我只做了5件事,如今跳槽天猫拿下offer(Java岗)

热门文章

  1. byte数组转blob类型_Blob类型转换为byte数组类型
  2. VR安全教育:打破“说教式”教育模式,让安全常伴
  3. java 原码 补码_Java基础 - 原码、反码、补码
  4. 全国行政边界json数据echarts地图geojson生成精确到城镇街道-20211208
  5. 数据库选型之路YMatrix与Clickhouse对比
  6. Reflections
  7. 加密文件,扣一复活科比
  8. 国内外交通数据集介绍(附参数说明)
  9. 定量预测方法总结及案例实践
  10. 书法之美--篆书在线查询