模板字符串

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

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

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

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

而现在:

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

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

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

为此,引出了标签模板的概念。

标签模板

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

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

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

标签模板其实不是模板,而是函数调用的一种特殊形式。“标签”指的是函数,紧跟在后面的模板字符串就是它的参数。

var a = 5;
var b = 10;
tag `Hello ${a+b} world ${a*b}`;
//这个标识名tag,它是一个函数。整个表达式的返回值,就是tag函数处理模板字符串之后的返回值。函数tag会依次接收到多个参数。

tag函数的第一个参数是一个数组,该数组的成员时模板字符串中那些没有变量替换的部分,也就是说,变量替换只发生在数组的第一个成员和第二个成员之间,以此类推。tag函数的其他参数都是模板字符串各个变量被替换后的值,由于本例中,模板字符串含有两个变量,因此tag会接收到value1和value2两个参数。
tag函数所有参数的实际值如下:
——第一个参数:['Hello ',' world ','']
——第二个参数:15
——第三个参数:50
也就是说tag函数实际上是以下面的形式调用的
tag(['Hello ',' world ',''],15,50);
我们可以按照需要编写tag 函数的代码。

var a = 5;
var b = 10;function tag(s,v1,v2){console.log(s[0]);console.log(s[1]);console.log(s[2]);console.log(v1);console.log(v2);return "ok";
}
tag`Hello ${a+b} world ${a*b}`;
//"Hello "
//" world "
//""
//15
//50
//"ok"

下面是一个更复杂的例子

var total = 30;
var msg = passthru`The total is ${total} (${total*1.05} with tax)`;
function passthru(literals){var result = "";var i = 0;while (i<literals.length){result += literals[i++]; literals这个数组包括的是模板字符串中那些没有变量替换的部分,也就是The total is,(,with tax).if(i<arguments.length){result+=arguments[i]; //arguments这个数组包括的是全部的参数,因为执行到这里的时候,i已经加1,所以result连接的是模板字符串各个变量被替换后的值。也就是这里的30,31.5}}return result;
}
msg //"The total is 30 (31.5 with tax)"
//上面这个例子展示了如何将各个参数按照原来的位置拼回去
//passthru函数采用rest参数的写法如下
function passthru(literals,...values){var output ="";for(var index = 0;index<values.length;index++){output = literals[index]+values[index];}output+=literals[index];return output;
}

标签模板的一个重要应用,就是过滤HTML字符串,防止用户输入恶意内容

function SaferHTML(templateData){var s = templateData[0];var i;for(i = 1;i<arguments.length;i++){var arg = String(arguments[i]);//sender里面可能有特殊字符,进行转义s += arg.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");s += templateData[i];}console.log(i);//2,表示这个循环只执行了一次,因为templateData[0]="<p>",arguments这个数组只有${sender}这个元素,后面一长串字符都是templateData[2];return s;
}
var sender = '<script>alert("abc")</script>';
var message = SaferHTML`<p>${sender} has sent you a message.</p>`;
console.log(message);

var total = 30;
var msg = passthru`The total is ${total}${total*1.05} with tax)`;
function passthru(literals){var result = "";var i = 0;while (i<literals.length){console.log(arguments[i]);// console.log(literals[i++]);result += literals[i++];if(i<arguments.length){result+=arguments[i];// console.log(arguments[i]);}}return result;
}
console.log(msg);

标签模板的另一个应用是多语言转换(国际化处理)

var book = {title:"shiji",author:"simaqian"
};
var book1 = {title:"sanguo",author:"luo"
};
var myBooks = [book,book1];
function hashTemplate(templateData){var s = "";var i = 0;while(i<templateData.length){s += templateData[i++];if(i<arguments.length){s += arguments[i];}}return s;
}
var libraryHtml = hashTemplate`<ul>#for book in ${myBooks}<li><i>${book.title}</i> by ${book.author}</li>#end</ul>
`;
console.log(libraryHtml);

模板处理函数的第一个参数(模板字符串数组)还有一个raw属性

在谷歌浏览器中,运行出来,还是本身,没有变化。

String.raw()

ES6还为原生的String对象提供了raw方法
String.raw方法往往用来充当模板字符串的处理函数,返回一个反斜线都被转义(即反斜线前面再加一个反斜线)的字符串,对应于替换变量后的模板字符串
String.rawHi\n${2+3}!;
//"Hi\n5!"

String.rawHi\\n
//"Hi\n"


String.raw = function(strings,...values){var output = "";for(var index = 0;index<values.length;index++){output += strings.raw[index]+values[index];}output += strings.raw[index];return output;
}

String.raw方法可以作为处理模板字符串的基本方法,它会将所有变量替换,并对反斜线进行转义,方便下一步作为字符串使用
String.raw方法也可以作为正常的函数使用,这时,其第一个参数应该是一个具有raw属性的对象,且raw属性的值应该是一个数组。

String.raw({raw:'test'},0,1,2);
//"t0e1s2t"//等同于
String.raw({raw:['t','e','s','t']},0,1,2);

ES6 标签模板与模板字符串相关推荐

  1. ES6 标签模板(Tagged templates)

    ES6标签模板(Tagged templates) 一.简介 标签模板允许你用一个方法去解析模板字符串.该方法形参的第一个参数是一个字符串数组,后面的几个参数是你传入的用${}表示的其他变量.该方法可 ...

  2. ES6之什么是模板字符串?

    我们为什么需要模板? 在生活中,我们去银行签一些单子,或者生活中写一些请假条,我们都会有一个模板进行参照,哪里哪里需要怎么填写,哪里自由发挥.就是一种格式的提现.在我们前端中,这个模版又是什么样的概念 ...

  3. ES6新特性_ES6模板字符串---JavaScript_ECMAScript_ES6-ES11新特性工作笔记007

    然后我们再去看ES6中模板字符串的用法 1.ES6引入了一个模板字符串的概念,很好用 通过`` 反引号来声明. 可以看到上面 然后可以看到以前我们声明一个字符串太长的话,中间还得用+号拼接什么的比较麻 ...

  4. ie模版字符串_字符串模板、模板字符串、Vue中使用template等等。

    1:模板字符遇新是直朋能到串 传统的一如分算需上来处一定迹面数一跳这件我子作JS语言,输出模板新直能分支调二浏页器朋代说,事刚需求是这样写的: $('#result').append( 'There ...

  5. ThinkPHP6 模板引擎普通标签中,模板引擎运算符函数,循环标签,判断标签的使用,及一些特殊标签

    ThinkPHP6 模板引擎普通标签中,模板引擎运算符函数,循环标签,判断标签的使用,及一些特殊标签 模板引擎支持普通标签和XML标签方式两种标签定义,分别用于不同的目的: 标签类型 描述 普通标签 ...

  6. php 标签库,PHP.MVC的模板标签系统之模板标签库

    TagActionDispatcher是一个标准的ActionDispatcher类的实现,它支持访问基本模板标签.TagActionDispatcher类支持相同的ActionObjects集合和V ...

  7. Java 模板变量替换——字符串替换器

    Java 模板变量替换--字符串替换器 说明 可选方法 org.apache.commons.text java.text.MessageFormat java.lang.String 说明 这里分享 ...

  8. SpringBoot通过freemarker模板,返回字符串或生成文件

    目的:通过一个模板文件,数据填充后以字符串返回,或者生成一个文件 pom文件: <dependency><groupId>org.springframework.boot< ...

  9. Vue.js 使用script或template标签创建组件模板内容

    为了使HTML代码和JavaScript代码是分离的,便于以后的阅读和维护,我们可以并建议使用<script>或<template>标签创建组件模板内容. <!DOCTY ...

  10. phpcms v9 模板标签技巧,模板标签常用方法

    phpcms v9 模板标签技巧,模板标签常用方法 phpcms v9模板制作常用代码集合 1.截取调用标题长度 {str_cut($r[title],36,'')} 2.格式化时间 调用格式化时间 ...

最新文章

  1. 仅需1/5成本:TPU是如何超越GPU,成为深度学习首选处理器的
  2. python - paramiko模块 修改logging提示为静默
  3. 用axis开发webservice实践
  4. DM3730 LCD控制器驱动框架
  5. Ampere Altra Max 对比测试数据公布,性能能效双领先
  6. Aspose-Cells结合Apache POI生成excel文件以及转换为pdf
  7. [Apio2012]dispatching 左偏树
  8. 亲测可用|奥维互动地图加载谷歌地图等图源的方法
  9. azw3怎么在Mac电脑上打开?
  10. 小学课本的“七桥问题”
  11. 2020博客之星年度总评选 - 显示排名
  12. 植物大战僵尸存档关卡和金币修改
  13. 树莓派4B (Raspberry pi 32 bit)安装uv4l驱动,解决opencv无法获取CSI摄像头图像问题
  14. ios wallet开发_iOS Wallet 开发
  15. Kal系统学习:记录一次wifi破解过程
  16. javaweb实现购物车功能
  17. [C#][Windows窗体程序]实现自动出题并判分
  18. 在Qt Creator中的pro文件添加lib库
  19. 收集:现场救人、抗震救援、灾后心理援助、地震和救灾的常见误区、地震时使用手机报平安办法...
  20. 微信小程序 input事件绑定

热门文章

  1. 科研篇二:对抗样本(Adversarial Example)综述
  2. navicat数据插入失败一种原因(1062 Duplicate entry)
  3. 奎特尔星球|雷神之锤(下)
  4. 用python求解考研数学真题
  5. mac连不上wi-fi_如何在Mac上确定Wi-Fi网络的优先级
  6. Cocos2dx 3.2 之实现精灵图片放大功能
  7. 容器技术对比(Docker/LXC/LXD/Multipass)
  8. Spek - 规范框架
  9. 电脑ip地址查询要怎么做?查询IP地址就看这3种方法
  10. Ubuntu下运行Swarm Bee节点