浅谈ES6 模板字符串的具体使用方法


Posted in Javascript onNovember 07, 2017

写在前面

关于 ES6, 也终于在 2015 年的 7 月 18 号尘埃落定了。虽然说各大浏览器还没有全面的支持,不过这并不妨碍我们一颗想要撸一把的心。在后端,可以使用 Node.js(0.12+)或 io.js, 前端的话,也可以使用Babel 或Traceur 进行语法预转义成 ES5使用 。

关于该系列(不知道能不能成为一个系列,总是各种懒),会没有规律的挑选一些内容来学习。欢迎大家积极纠错,留言探讨。

模板字符串(template strings)

用法

// 普通字符串
`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?

ES6 中引进的一种新型的字符串字面量语法 - 模板字符串。书面上来解释,模板字符串是一种能在字符串文本中内嵌表示式的字符串字面量。简单来讲,就是增加了变量功能的字符串。

先来看一下以前我们对字符串的使用:

/**
 * Before ES6 字符串拼接
 */
var name = '丁香医生';
var desc = '丁香医生是面向大众的科普性健康类网站';
var html = function(name, desc){
  var tpl = '公司名:' + name + '\n'+
      '简介:'+ desc;
  return tpl;
}

而现在:

var html = `公司名:${name}
  简介:${desc}`;

很简洁吧。

引一段 MDN 对于模板字符串的定义:

模板字符串使用反引号 () 来代替普通字符串中的用双引号和单引号。模板字符串可以包含特定语法(${expression})的占位符。占位符中的表达式和周围的文本会一起传递给一个默认函数,该函数负责将所有的部分连接起来。

而占位符${},可以是任意的 js 表达式(函数或者运算),甚至是另一个模板字符串,会将其计算的结果作为字符串输出。如果模板中需要使用$,{等字符串,则需要进行转义。

看个例子就明白了。

var x = 1;
var y = 2;
`${ x } + ${ y } = ${ x + y}` // "1 + 2 = 3"

不同于普通字符串,模板字符串还可以多行书写,模板字符串中所有的空格,新行,缩进都会原样的输出在生成的字符串中。

而单纯的模板字符串还存在着很多的局限性。如:

  1. 不能自动转义特殊的字符串。(这样很容易引起注入攻击)
  2. 不能很好的和国际化库配合(即不会格式化特定语言的数字,日期,文字等)
  3. 没有内建循环语法,(甚至连条件语句都不支持, 只可以使用模板套构的方法)

标签模板(tagged template)

为此,引出了标签模板的概念。标签模板则是在反引号前面引入一个标签(tag)。该标签是一个函数,用于处于定制化模板字符串后返回值。就拿上面对特殊字符串举例。

/**
 * HTML 标签转义
 * @param {Array.<DOMString>} templateData 字符串类型的tokens
 * @param {...} ..vals 表达式占位符的运算结果tokens
 * 
 */
function SaferHTML(templateData) {
 var s = templateData[0];
 for (var i = 1; i < arguments.length; i++) {
  var arg = String(arguments[i]);
  // Escape special characters in the substitution.
  s += arg.replace(/&/g, "&")
      .replace(/</g, "<")
      .replace(/>/g, ">");
  // Don't escape special characters in the template.
  s += templateData[i];
 }
 return s;
}
// 调用
var html = SaferHTML`<p>这是关于字符串模板的介绍</p>`;

标签函数会接收多个参数。

  1. 第一个参数是包含了字符串字面量(即那些没有变量替换的值)的数组
  2. 后面的参数是已经替换后的变量值

改一下例子1

var name = '丁香医生';
var desc = '丁香医生是面向大众的科普性健康类网站';
tag`公司名:${name}简介:${desc}`

tag 的参数则分别为 ['公司名:','简介:'], '丁香医生', '丁香医生是面向大众的科普性健康类网站'。

有了此类方法,就大大的增加了控制的权利。如上面说的国际化库甚至循环语句。

浏览器兼容性

  1. 服务器端, io.js 支持
  2. 浏览器端, FF34+ , chrome 41+
  3. 移动端 IOS 8, Android 4.4
  4. IE Tech Preview

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js弹出模式对话框,并接收回传值的方法
Mar 12 Javascript
JavaScript中几个重要的属性(this、constructor、prototype)介绍
May 19 Javascript
Html5的placeholder属性(IE兼容)实现代码
Aug 30 Javascript
使用ajax+jqtransform实现动态加载select
Dec 01 Javascript
基于js实现的限制文本框只可以输入数字
Dec 05 Javascript
javascript编程开发中取色器及封装$函数用法示例
Aug 09 Javascript
vue实现登陆登出的实现示例
Sep 15 Javascript
详解vue+vuex+koa2开发环境搭建及示例开发
Jan 22 Javascript
详解vue-cli 本地开发mock数据使用方法
May 29 Javascript
vue中render函数的使用详解
Oct 12 Javascript
js定义类的方法示例【ES5与ES6】
Jul 30 Javascript
JavaScript制作3D旋转相册
Aug 02 Javascript
微信小程序上传图片到服务器实例代码
Nov 07 #Javascript
解决Vue使用mint-ui loadmore实现上拉加载与下拉刷新出现一个页面使用多个上拉加载后冲突问题
Nov 07 #Javascript
vue组件间通信子与父详解(二)
Nov 07 #Javascript
原生JS实现 MUI导航栏透明渐变效果
Nov 07 #Javascript
mongoose设置unique不生效问题的解决及如何移除unique的限制
Nov 07 #Javascript
vue组件父与子通信详解(一)
Nov 07 #Javascript
vue组件父子间通信之综合练习(聊天室)
Nov 07 #Javascript
You might like
QQ互联一键登录审核不通过的解决方案
2014/09/10 PHP
PHP Curl模拟登录微信公众平台、新浪微博实例代码
2016/01/28 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
基于jquery的图片的切换(以数字的形式)
2011/02/14 Javascript
js验证模型自我实现的具体方法
2013/06/21 Javascript
jquery自动填充勾选框即把勾选框打上true
2014/03/24 Javascript
js判断元素是否隐藏的方法
2014/06/09 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
2014/06/16 Javascript
jQuery无刷新分页完整实例代码
2015/10/27 Javascript
Vue导出json数据到Excel电子表格的示例
2017/12/04 Javascript
vue 本地环境跨域请求proxyTable的方法
2018/09/19 Javascript
详解小程序不同页面之间通讯的解决方案
2018/11/23 Javascript
django使用channels2.x实现实时通讯
2018/11/28 Javascript
file-loader打包图片文件时路径错误输出为[object-module]的解决方法
2020/01/03 Javascript
js原生map实现的方法总结
2020/01/19 Javascript
ant design vue嵌套表格及表格内部编辑的用法说明
2020/10/28 Javascript
[03:52]显微镜下的DOTA2第三期——英雄在无聊的时候干什么
2014/06/20 DOTA
跟老齐学Python之私有函数和专有方法
2014/10/24 Python
Python中使用tarfile压缩、解压tar归档文件示例
2015/04/05 Python
Python实现的ftp服务器功能详解【附源码下载】
2019/06/26 Python
使用Python的datetime库处理时间(RPA流程)
2019/11/24 Python
python中从for循环延申到推导式的具体使用
2019/11/29 Python
Python代码一键转Jar包及Java调用Python新姿势
2020/03/10 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
2020/06/22 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
2020/08/18 Python
美国杰西潘尼官网:JCPenney
2019/06/12 全球购物
迪奥美国官网:Dior美国
2019/12/07 全球购物
软件测试英文面试题
2012/10/14 面试题
毕业生求职的求职信
2013/12/05 职场文书
2014年教师培训的自我评价
2014/01/03 职场文书
优秀管理者获奖感言
2014/02/17 职场文书
爸爸的花儿落了教学反思
2014/02/20 职场文书
学校党的群众路线教育实践活动整改措施
2014/10/25 职场文书
迎新生欢迎词
2015/01/23 职场文书
Python将CSV文件转化为HTML文件的操作方法
2021/06/30 Python
MySQL如何快速创建800w条测试数据表
2022/03/17 MySQL