javascript模板字符串(标签函数)
前面介绍了javascript的模板字符串的基本知识,今天深入学习一下标签函数
模板字符串概述
这里先简单说一下模板字符串的概念
1、模板字符串,从名字上可以得出其实返回的是字符串,普通使用其实就想引号一样的使用,只是加了一些功能
注:先这些实验例子都是自浏览器控制台中测试的。
当做引号使用,返回字符串
`aaaaa`
//返回字符串"aaaaa"
插入表达式,其实有点格式化输出的感觉
var a=123;
`aaa${a}aaa`
//返回字符串"aaa123aaa"
带标签的模板字符串,可以自定义函数处理模板字符串
var person = 'Mike';
var age = 28;
function myTag(strings, personExp, ageExp) {
var str0 = strings[0]; // "that "
var str1 = strings[1]; // " is a "
// There is technically a string after
// the final expression (in our example),
// but it is empty (""), so disregard.
// var str2 = strings[2];
var ageStr;
if (ageExp > 99){
ageStr = 'centenarian';
} else {
ageStr = 'youngster';
}
return str0 + personExp + str1 + ageStr;
}
var output = myTag`that ${ person } is a ${ age }`;
console.log(output);
//输出字符串that Mike is a youngster
这里需要注意的一点是,使用标签函数时,模板字符串会解析成字符串数组跟各个${}的值,然后传入标签函数中,因为标签函数的入参就是这样的,下面会深入将标签函数的。
标签函数定义
标签使您可以用函数解析模板字符串。
标签函数的第一个参数包含一个字符串值的数组。其余的参数与表达式相关。最后,你的函数可以返回处理好的的字符串(或者它可以返回完全不同的东西,全看标签函数的处理)。用于该标签的函数的名称可以被命名为任何名字。
下面看一下标签函数的组成
function Tag(strings, personExp,ageExp,...)
//strings:字符串数组,这个其实就是以${}分分隔符分割得到的数组
//personExp:模板字符串中第一个${}的值
//ageExp:模板字符串中第二个${}的值
//...:模板字符串中第n个${}的值
我们可以看个例子,console.log可以打印出来
console.log `aaa${1}bbb`
//['aaa','bbb'] 1
console.log `aaa${1}b${2}bb`
//['aaa','b','bb'] 1 2

可以很好的看到,使用标签函数时,模板字符串会被分解成各部分,然后传入标签函数中进行处理。
而标签函数怎么处理完全看函数内部是怎么实现的了,上面例子中实现的myTag标签函数就是拼接字符串然后返回,就相当于字符串拼接的功能。
拓展问题--内置函数作标签函数使用
从上面学习,标签函数是可以自己实现的,除了内置的标签函数,用内置函数是不是也可以作标签函数呢
我们用alert函数试一下
alert`aa${1}bbb`
//返回字符串"aa,bbb"
//实际模板字符串分解后的数据是['aa','bbb'] 1
为什么呢,猜想原因有两个
1、alert内置函数的入参可能只有一个,所以只传入了数组
2、alert内置函数的内部处理逻辑是把数组内容拼接,以,分割
验证第一个猜想
使用另一个函数,上面例子也是用过的console.log,
console.log(obj1 [, obj2, ..., objN]);
这个函数入参有很多个
console.log `aaa${1}bbb`
//['aaa','bbb'] 1
console.log `aaa${1}b${2}bb`
//['aaa','b','bb'] 1 2
从输出结果来看,这个就把所有参数都传入了
验证第二个猜想
上面console.log的例子也证明了第二个猜想,跟alert不同,console.log没有做处理,而是将输入直接输出,跟alert不一样
结论
1、可自定义标签函数
2、js内置函数也可作为标签函数,但是需要考虑入参数量,及处理逻辑
javascript模板字符串(标签函数)的更多相关文章
- JavaScript中字符串分割函数split用法实例
这篇文章主要介绍了JavaScript中字符串分割函数split用法,实例分析了javascript中split函数操作字符串的技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了JavaSc ...
- 【JavaScript】字符串处理函数集合
var $string = {}, toString, template, parseURL, buildURL, mapQuery, test, contains, trim, clean, cam ...
- javascript模板字符串(反引号)
模板字面量 是允许嵌入表达式的字符串字面量. 你可以使用多行字符串和字符串插值功能.它们在ES2015规范的先前版本中被称为“模板字符串”. 语法 `string text``string text ...
- JavaScript中字符串截取函数slice()、substring()、substr()
在js中字符截取函数有常用的三个slice().substring().substr()了,下面我来给大家介绍slice().substring().substr()函数在字符截取时的一些用法与区别吧 ...
- Javascript常用字符串判断函数
[代码] 字符串,函数,Javascript,脚本100 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ...
- 浅析JavaScript的字符串查找函数:indexOf和search
语法 ①indexOf:方法可返回某个指定的字符串值在长字符串中首次出现的位置.如果被查找字符串没有找到,返回-1. indexOf 说明:该方法将从头到尾地检索字符串 stringObject,看它 ...
- JavaScript substr() 字符串截取函数使用详解
substr 定义和用法 substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符. 语法 stringObject.substr(start,length) 如果 length ...
- javascript 将字符串当函数执行
//语法 eval(str); //demo var t = "func"; eval(''+func+'()');
- SE6 模板字符串详解
SE6引入了模板字符串这样一个概念,让我们从无止尽的+连接字符串中解脱了出来,SE5中也可以在字符串末尾添加\实现,不过模板字符串更加好用和强大. SE6模板字符串是用反撇号(`,即键盘上和~键同一个 ...
随机推荐
- 谷歌云服务器XShell登录
一,谷歌云服务器,默认用浏览器进行SSH链接,而且也不告知密码.以Centos为例,先使用浏览器连接 1,给root修改密码 sudo passwd root 2,编辑ssh配置文件 sudo nan ...
- SAS数据挖掘实战篇【五】
SAS数据挖掘实战篇[五] SAS--预测模型 6.1 测模型介绍 预测型(Prediction)是指由历史的和当前的数据产生的并能推测未来数据趋势的知识.这类知识可以被认为是以时 间为关键属性的关联 ...
- JavaScript参考DOM部分
目录 DOM完整版 DOM 介绍 节点 节点树 Node接口 属性 方法 NodeList 接口,HTMLCollection 接口 介绍 NodeList.prototype.length Node ...
- redis缓存服务器
1.什么是redis? Redis 是一个基于内存的高性能key-value数据库. 2.使用redis的好处? 速度快,因为数据存在内存,类似hashmap,hashmap的优势就是查找和操作的时间 ...
- DES、AES和RSA加密算法
DES加密算法简介 DES(Data Encryption Standard)是目前最为流行的加密算法之一(它是分组密码). 强加密使用的基本操作 -> 混淆与扩散 混淆:是一种使密钥与密文之间 ...
- Nexus2 yum插件RCE漏洞(CVE-2019-5475)
1.漏洞简介: 安全研究员Christian August Holm Hansen在Nexus Repository Manager 2.X中披露了一个远程命令执行漏洞. 该漏洞默认具有部署权限帐户. ...
- 开启httpfs
参考: https://docs.cloudera.com/documentation/enterprise/6/6.2/topics/admin_httpfs.html#xd_583c10bfdbd ...
- Luogu P3810 【模板】三维偏序(陌上花开)(CDQ分治)
题目 以三维偏序为例来讲一下CDQ分治. CDQ的本质就是把一个序列分成两段,计算左边对右边的贡献,然后分治. 不过一般都是先分治到底再从下往上算,这样可以先归并再算. 比如这道题,我们先按第一维排序 ...
- MFC多线程的创建使用
最近学习了MFC多线程的使用, 写了一个继承CWinThread类的类MyThread: 在头文件开头用#define定义一个线程函数入口地址(会在下面定义代码中写出) 在类的开头加上IMPLEMEN ...
- Python模拟进度条
import time for i in range(0,101,2) time.sleep(0.2) num = i // 2 per = '\r %s %% : %s'%(i,'*'*num) p ...