位置: 编程技术 - 正文

详解JavaScript ES6中的模板字符串

编辑:rootadmin

推荐整理分享详解JavaScript ES6中的模板字符串,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

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

之所以被称为模板字符串,是因为模板字符串为 JS 引入了简单的字符串插值特性,也就是说,可以方便优雅地将 JS 的值插入到字符串中。

很多地方可以用到模板字符串,看下面这个不起眼的错误提示消息:

上面代码中,${user.name} 和 ${action} 被称为模板占位符,JavaScript 将把 user.name和 action 的值分别插到对应的位置上,然后生成像这样 “User jorendorff is not authorized to do hockey.” 的字符串。

现在,我们看到了一个比 + 运算符更优雅的语法,下面是一些你期待的特性:

模板占位符可以是任何 JavaScript 表达式,所以函数调用和四则运算等都是合法的。(甚至你还可以在一个模板字符串中嵌套另一个模板字符串。) 如果一个值不是字符串,它将被转换为字符串。例如,如果 action 是一个对象,那么该对象的 .toString() 将被调用,来将其转换为字符串。 如果你想在模板字符串中使用反引号,你需要使用反斜杠 将其转义。 同样地,如果想在模板字符串中输出 ${,也需要使用反斜杠将其转义:${ 或 ${。 模板字符串可以跨越多行:

模板字符串中所有的空格、换行和缩进,都将被原样输出到结果字符串中。

下面我们来看看模板字符串做不到的事情:

不会自动转义特殊字符,为了避免跨站脚本漏洞,你还是需要小心对待不可信的数据,这一点上与普通字符串一样。 不能与国际化库配合使用,不处理特殊语言格式的数字、日期等。 不是模板引擎(比如 Mustache 或 Nunjucks)的替代品。模板字符串没有处理循环的语法 — 不能通过一个数组构建出一个表格(table)。

为了解决这些限制,ES6 为开发者和库设计者提供了另一种模板字符串 — 标签模板。

标签模板的语法很简单,只需要在开始的反引号前引入一个标签。看第一个例子:SaferHTML,我们要使用这个标签模板来解决上述的第一个限制:自动转义特殊字符。

需要注意的是,SaferHTML 方法并不是 ES6 标准库提供的,我们需要自己来实现:

这里的 SaferHTML 标签是单个标识符,标签也可以是属性,比如 SaferHTML.escape,甚至还可以是方法调用:SaferHTML.escape({unicodeControlCharacters: false})。准确地说,任何 ES6 的成员表达式或调用表达式都可以作为标签。

详解JavaScript ES6中的模板字符串

可以看出,模板字符串仅仅是字符串连接的语法糖,而标签模板确是一个完全不同的东西:函数调用。

所以,上面代码等价于:

其中 templateData 是一个不可变的字符串数组,由 JS 引擎基于源模板字符串生成,这里的数组含有两个元素,因为模板字符串被占位符分隔后含有两个字符串,因此,templateData 将是这样: Object.freeze(["<p>", " has sent you a bonk.</p>"]

(事实上,templateData 上还有另一个属性:templateData.raw,本文并深入不讨论该属性。该属性的值也是一个数组,包含了标签模板中所有的字符串部分,但字符串中包含了转义序列,看上去更像源代码中的字符串,比如 n。ES6 的内置标签 String.raw 将使用这些字符串。)

这就使得 SaferHTML 方法可以随意解析这两个字符串,存在 N 中替换方式。

在继续阅读钱,你可能在苦苦思索如何实现 SaferHTML 方法。

下面是一种实现(gist):

有了上面的方法,即使使用一个恶意的用户名,用户也是安全的。

一个简单的例子并不足以说明标签模板的灵活性,让我们重温一下上面列举的模板字符串的限制,看看我们还可以做些什么。

模板字符串不会自动转义特殊字符,但是我们可以通过标签模板来解决这个问题,事实上我们还可以将 SaferHTML 这个方法写的更好。从安全角度来看,这个 SaferHTML 非常脆弱。在 HTML 中,不同的地方需要用不同的方式去转义,SaferHTML 并没有做到。稍加思考,我们就可以实现一个更加灵活的 SaferHTML方法,能够将 templateData 中的任何一个 HTML 转义,知道哪个占位符是纯 HTML;哪个是元素的属性,从而需要对 ' 和 " 转义;哪个是 URL 的 query 字符串,从而需要用 URL 的 escaping 方法,而不是 HTML 的 escaping;等等。这似乎有些牵强,因为 HTML 转义效率比较低。辛运是的,标签模板的字符串是保持不变的,SaferHTML 可以缓存已经转义过的字符串,从而提高效率。 模板字符串并没有内置的国际化特性,但通过标签模板,我们可以添加该特性。Jack Hsu 的文章详细介绍了实现过程,看下面例子:

上面例子中的 name 和 amount 很好理解,将被 JS 引擎替换为对应的字符串,但是还有一个没有见过的占位符::c(CAD),这将被 in 标签处理,从 in 的文档可知::c(CAD)表示 amount 是加拿大美元货币值。

模板字符串不能替代 Mustache 和 Nunjucks 这类模板引擎,部分原因在于模板字符串不支持循环和条件语句。我们可以编写一个标签来实现这类功能:

灵活性还不止于此,需要注意的是,标签函数的参数不会自动转换为字符串,参数可以是任何类型,返回值也一样。标签模板甚至可以不需要字符串,你可以使用自定义标签来创建正则表达式、DOM 树、图片、代表整个异步进程的 Promise、JS 数据结构、GL 着色器…

标签模板允许库设计者创建强大的领域特定语言。这些语言可能看上去并不像 JS,但他们可以无缝嵌入到 JS 中,并且可以与语言的其余部分进行交互。顺便说一下,我还没有在其他语言中见过类似的特性,我不知道这个特性讲给我们带来些什么,但各种可能性还是非常令人兴奋的。

详解JavaScript ES6中的Generator 今天讨论的新特性让我非常兴奋,因为这个特性是ES6中最神奇的特性。这里的神奇意味着什么呢?对于初学者来说,该特性与以往的JS完全不同,甚至有

深入了解JavaScript中的Symbol的使用方法 Symbol是什么?Symbols不是图标,也不是指在代码中可以使用小图片:也不是指代其他一些东西的语法。那么,Symbol到究竟是什么呢?七种数据类型JavaScript

深入理解JavaScript中的箭头函数 从一开始箭头就是JavaScript的一部分,在第一个JavaScript中就建议将内联的脚本代码包裹在HTML的注释中,这可以防止那些不支持JavaScript的浏览器错误滴将

标签: 详解JavaScript ES6中的模板字符串

本文链接地址:https://www.jiuchutong.com/biancheng/377569.html 转载请保留说明!

上一篇:深入学习JavaScript中的Rest参数和参数默认值(深入学习习总书记系列讲话精神)

下一篇:详解JavaScript ES6中的Generator

  • 建筑业印花税核定征收
  • 流转税具体的账务处理,可以怎样考虑?
  • 营业收入与利润变化图
  • 牛奶 税率
  • 股东投入资金大,但不想成为法人
  • 作家以及作品
  • 临时工工资能否用公户支付
  • 房租合同印花税计算方法
  • 停业之后申请恢复营业申请书范文
  • 通行费抵扣入账会计分录?
  • 车间停产期间设施有哪些
  • 企业计提固定资产折旧
  • 稳定性流动资产是经营性流动资产吗
  • 买鼠标去哪买
  • 虚开发票对所得税的影响是怎样的?
  • 交际应酬费用
  • 在PDF里怎么将A4缩小转换为一半打印出来
  • 无偿赠与钱要交税吗
  • 电子银行承兑如何背书给别人
  • 建筑公司工程款支付审批流程
  • 免抵退转免税
  • 简易征收当月已经开出的17%怎么办?
  • 销售商品结转成本会计分录
  • 工程预算费用会计怎么做
  • 积分抵现金活动怎么做
  • 评估报告怎么算合法
  • 接受捐赠收入要计入销售收入吗
  • 向房东要押金的不犯法的妙招
  • 结转待抵扣
  • 自创商誉的确认
  • 长期借款科目的期末余额
  • 高新技术企业研究开发费用加计扣除
  • lstm多对多
  • 黄石国家公园里的必玩项目
  • 房地产企业项目开发法律风险
  • 外购货物用于公益性捐赠
  • push指令执行的详细过程
  • 售后租回交易形成融资租赁,销售时不确认处置损益
  • 国企无偿划转股权免印花税
  • 管家婆系统能否查询上月库存明细
  • 经济独立可以做什么
  • 培训费开票属于哪个征收明目
  • php array_fill
  • 代销费是谁给谁
  • 个人向企业借贷违法吗
  • sql server如何进行安全设置
  • 采用权益法核算的长期股权投资时,对于被投资企业
  • 公司注销了,账务是不是可以销毁了
  • sqlserver有实例吗
  • mysql文件更改存放路径
  • 无形资产出售当月是否摊销
  • 可供出售金融资产名词解释
  • 企业所得税退税会计分录
  • 差额开票和全额开票
  • 以公允价值计量计入其他综合收益
  • 农产品税率2020年计算
  • 促销费会计分录怎么写
  • 小规模纳税人和一般纳税人的界定标准
  • 软件公司会计科目
  • 办理契税所需要的证件
  • 一般纳税人福利费
  • 将现金存入银行编制什么凭证
  • 购买银行承兑汇票现金流量表怎么填
  • 收付实现制下收入包括增值税吗
  • win10入门全教程视频
  • 在windows操作中
  • RHCE心得3 基于VSFTP的本地YUM源及光盘YUM源搭建步骤分享
  • diskgenius_winpe文件夹能删吗
  • mac电池不能被识别吗
  • linux中修改命令
  • Win10 Mobile RedStone预览版14267更新内容汇总(持续更新)
  • 图片批量压缩到200k以下
  • angular form表单
  • jquery的认识和使用
  • 深入php面向对象、模式与实践第5版 电子书
  • javascript获取值
  • JavaScript基本语法与页面对象的应用
  • 宁波税务局网上办税服务厅
  • 简述绩效信息的收集原则
  • 哈尔滨地税局电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设