前面介绍了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模板字符串(标签函数)的更多相关文章

  1. JavaScript中字符串分割函数split用法实例

    这篇文章主要介绍了JavaScript中字符串分割函数split用法,实例分析了javascript中split函数操作字符串的技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了JavaSc ...

  2. 【JavaScript】字符串处理函数集合

    var $string = {}, toString, template, parseURL, buildURL, mapQuery, test, contains, trim, clean, cam ...

  3. javascript模板字符串(反引号)

    模板字面量 是允许嵌入表达式的字符串字面量. 你可以使用多行字符串和字符串插值功能.它们在ES2015规范的先前版本中被称为“模板字符串”. 语法 `string text`​`string text ...

  4. JavaScript中字符串截取函数slice()、substring()、substr()

    在js中字符截取函数有常用的三个slice().substring().substr()了,下面我来给大家介绍slice().substring().substr()函数在字符截取时的一些用法与区别吧 ...

  5. 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 ...

  6. 浅析JavaScript的字符串查找函数:indexOf和search

    语法 ①indexOf:方法可返回某个指定的字符串值在长字符串中首次出现的位置.如果被查找字符串没有找到,返回-1. indexOf 说明:该方法将从头到尾地检索字符串 stringObject,看它 ...

  7. JavaScript substr() 字符串截取函数使用详解

    substr 定义和用法 substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符. 语法 stringObject.substr(start,length) 如果 length ...

  8. javascript 将字符串当函数执行

    //语法 eval(str); //demo var t = "func"; eval(''+func+'()');

  9. SE6 模板字符串详解

    SE6引入了模板字符串这样一个概念,让我们从无止尽的+连接字符串中解脱了出来,SE5中也可以在字符串末尾添加\实现,不过模板字符串更加好用和强大. SE6模板字符串是用反撇号(`,即键盘上和~键同一个 ...

随机推荐

  1. 2019.11.10【每天学点SAP小知识】Day3 - ABAP 7.40新语法 值转化和值赋值

    1.语法为 CONV dTYPE|#(...)\ # 代表任意类型 "7.40之前表达式 . DATA helper TYPE string. DATA xstr TYPE xstring. ...

  2. ubuntu下自动获取ip设置

    vi /etc/network/interfaces文件为如下内容 wq保存 重启网卡:sudo /etc/init.d/networking restart

  3. CTF—攻防练习之HTTP—SQL注入(X-forwarded-For)

    主机:192.168.32.152 靶机:192.168.32.162 nmap,dirb扫ip,扫目录 在后台发现一个login,登录界面 然后直接上扫描器AVWS,发现存在X—Forwarded— ...

  4. idea退出提醒 打开

    有时候会误点下面的勾选框,导致以后直接退出,没有提示,很不方便,经常误点关闭,再次打开又要等很久 如何设置回来? File-Setting-Appearance&Beha-System Set ...

  5. 【JulyEdu-Python基础】第 1 课:入门基础

    一些学习资源的收集: 可汗学院 视频 公开课 Grossin 编程教室: 一个非常简单,对初学者非常友好的教程和在线联系 廖雪峰教程 书籍: Python核心编程: 这本书应该是最清楚.最深入全面的书 ...

  6. word2010 标题自动编号设置

    今天打算写篇文档,发现生成标题时无法自动生成编号,上网查了一下,现在把解决办法跟附图一块儿奉上. 新建word文档: 默认版式: 设置自动编号所在工具栏位置: 设置选择: 最终结果:

  7. js继承的方式及其优缺点

    js继承方法 前因:ECMAScript不支持接口继承,只支持实现继承 一.原型链 概念:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针,让 ...

  8. 使用PowerShell 修改hosts

    直接上代码 # author:lttr <www.cnblogs.com/GoCircle> # date:2019-08-09[CmdletBinding()] param ( [Par ...

  9. 牛客小白月赛14 -G (筛法)

    题目链接:https://ac.nowcoder.com/acm/contest/879/G 题意:给定A1和A数组公式: 以及B数组: 求 思路:利用筛法更新b数组,最后求异或和即可. AC代码: ...

  10. 【转贴】Debian 10 "buster" 正式发布

    Debian 10 "buster" 正式发布 https://news.cnblogs.com/n/627909/ 我看到龙芯的 就是 mips64el 的指令集.. Linux ...