前端开发系列127-进阶篇之tagged template
标签模板-tagged template 并非真正的字符串模板,而是一种特殊形式的函数调用。
在标签模板中的标签(tag)指的是函数,而跟在其后的模板表示的则是函数调用时传递的实际参数。假如我们存在一个函数 function tag(){console.log(arguments)},那么当在tag后跟上模板字符串的时候就会变成函数调用。
function tag() {
console.log(arguments);
}
let name = "Yong";
let age = 18;
tag `My name is ${name}. I'm ${age} years old`;
/* 打印输出 */
/*
[Arguments] {
'0': [ 'My name is ', '. I\'m ', ' years old' ],
'1': 'Yong',
'2': 18 }
*/
观察上面的代码和对应的执行结果,在 tag 函数 的调用过程中, 模板字符串部分My name is ${name}. I'm ${age} years old 被拆分成了不同的部分以参数形式传递到函数内容,具体在拆分的时候,所有非变量型(变量型指的是${name}这样的结构)的部分将被作为第一个参数传入,而所有变量型的数据则会依次跟在后面以第二、第三、第四... 参数的形式传入。
为了更方便的区分和处理这两部分参数,我们尝试通过剩余参数的方式来调整tag 函数的写法。
function tag(stringArr, ...args) {
console.log("第一部分:", stringArr);
console.log("第二部分:", args);
}
let name = "Yong";
let age = 18;
tag `My name is ${name}. I'm ${age} years old`;
/* 打印输出 */
/*
第一部分: [ 'My name is ', '. I\'m ', ' years old' ]
第二部分: [ 'Yong', 18 ]
*/
字符串双反引号的写法( 我们通常称为模板字符串 )是ES6为我们提供的新特性,作为增强版本的字符串,这个特性至少为我们带来了两点便利。
1、方便的处理字符串中的换行。
2、方便的在字符串中以${ }的形式来插入变量,以替代原本的 + 来完成拼接。
备注:在模板字符串的 ${} 中可以放任意的JavaScript表达式,譬如变量、普通字符串、简单计算、引用对象属性甚至是函数调用,具体可以参考下面的演示代码。
/* 1.插入变量 */
let address = "广州";
let str1 = `地址:${ address }`;
/* 2.插入数字 */
let str2 = `编号:${ 10086 }`;
/* 3.插入字符串 */
let str3 = `描述:${ 'description' }`;
/* 4.简单计算 */
let x = 1,
y = 5;
let str4 = `计算:${x} + ${y} * 2 == ${x + y * 2}`;
/* 5.函数调用 */
let callFn = () => "callFn be Call";
let str5 = `函数调用:${callFn() }`;
/* 6.测试三元运算符 */
let str6 = `三元运算符:${ 5>1 ?'结果大于1':'结果不大于1'}`;
/* 打印输出 */
console.log(str1);
console.log(str2);
console.log(str3);
console.log(str4);
console.log(str5);
console.log(str6);
/*
地址:广州
编号:10086
描述:description
计算:1 + 5 * 2 == 11
函数调用:callFn be Call
三元运算符:结果大于1 */
理所应当 && 自然而然,我们不假思索就用上了模板字符串这样牛逼的特性,不过我建议再多一层对反引号字符串的处理过程的思考,下面的代码中封装了一个函数来模拟和还原处理的过程。
function parse(strArr, ...args) {
/* 打印参数 */
console.log('strArr = ', strArr);
console.log('args = ', args);
let output = "";
args.forEach((s, idx) => {
console.log(`current - strArr[${idx}]`, strArr[idx]);
output += strArr[idx] + s;
})
/* 因为 args {变量参数}的个数总是会比strArr的数量多1,因此还需拼接末尾 */
output += strArr[strArr.length - 1];
return output;
}
let a = 1, b = 2;
/* 测试代码*/
console.log(parse `a = ${a} , b = ${b} , a + b = ${a + b} .`);
/* 打印输出
strArr = [ 'a = ', ' , b = ', ' , a + b = ', ' .' ]
args = [ 1, 2, 3 ]
current - strArr[0] a =
current - strArr[1] , b =
current - strArr[2] , a + b =
a = 1 , b = 2 , a + b = 3 .
*/

在上面的代码中,我们通过标签模板的调用结构,利用parse 函数完成了模板字符串的"还原"工作。
前端开发系列127-进阶篇之tagged template的更多相关文章
- openlayers5-webpack 入门开发系列一初探篇(附源码下载)
前言 openlayers5-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载 ...
- leaflet-webpack 入门开发系列一初探篇(附源码下载)
前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...
- 【Windows10 IoT开发系列】配置篇
原文:[Windows10 IoT开发系列]配置篇 Windows10 For IoT是Windows 10家族的一个新星,其针对不同平台拥有不同的版本.而其最重要的一个版本是运行在Raspberry ...
- ESP8266开发之旅 进阶篇② 闲聊Arduino IDE For ESP8266烧录配置
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- 【webpack 系列】进阶篇
本文将继续引入更多的 webpack 配置,建议先阅读[webpack 系列]基础篇的内容.如果发现文中有任何错误,请在评论区指正.本文所有代码都可在 github 找到. 打包多页应用 之前我们配置 ...
- iOS开发系列--Swift进阶
概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...
- 旨在脱离后端环境的前端开发套件 - IDT Server篇
IDT,一个基于Nodejs的,旨在脱离后端环境的前端开发套件,目的就是能让前端开发完全脱离后端的环境,无论后端是什么模板引擎(主流),都能应付自如. IDT主要包括两大部分:Server + Bui ...
- 前端开发【第2篇:CSS】
鸡血 样式的属性多达几千个,但别担心,按照80-20原则,常用的也就几十个,你完全可以掌握它. Css初识 HTML的诞生 早期只有HTML的时候为了让HTML更美观一点,当时页面的开发者会把颜色写到 ...
- [置顶]【实用 .NET Core开发系列】- 导航篇
前言 此系列从出发点来看,是 上个系列的续篇, 上个系列因为后面工作的原因,后面几篇没有写完,后来.NET Core出来之后,注意力就转移到了.NET Core上,所以再也就没有继续下去,此是原因之一 ...
- openlayers4 入门开发系列之风场图篇
前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...
随机推荐
- 在 Ubuntu 上安装 Python 3.11、创建虚拟环境并设置 pip 阿里云源的主要命令
在 Ubuntu 上安装 Python 3.11.创建虚拟环境并设置 pip 阿里云源的主要命令流程如下: 安装 Python 3.11 sudo apt update sudo apt instal ...
- spring_声明式事务: @Transactional
例子. <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://ww ...
- 快速理解 MCP 与 A2A 协议的关系,它们如何协作构建复杂AI系统
近期关于MCP协议的讨论非常热门,主要因为通过MCP协议通过标准化接口为 AI 应用与外部数据源建立统一交互通道,这使得大模型可以与外部数据源或工具进行交互,从而实现各种专业场景下的智能应用.关于如何 ...
- PHP实现文件上传下载实例详细讲解
一.上传原理与配置 1.1 原理 将客户端文件上传到服务器端,再将服务器端的文件(临时文件)移动到指定目录即可. 1.2 客户端配置 所需:表单页面(选择上传文件): 具体而言:发送方式为POST,添 ...
- 『Plotly实战指南』--样式定制高级篇
在数据可视化领域,Plotly不仅是高效的绘图工具,更是设计师的创意画布. 当基础图表已无法满足品牌化需求时,样式定制能力将成为数据叙事的关键武器. 深入的样式定制能够帮助我们打造品牌化图表.实现精准 ...
- SpringBoot——使用http2
使用http2 许多浏览器,包括Edge,仅在TLS(即HTTPS)情况下支持HTTP/2.即使服务器端配置为无TLS支持的HTTP/2,浏览器可能仍将回退到HTTP/1.1.所以我们需要有一个证书来 ...
- Servlet创建的三种方式
目录 1 实现Servlet接口 2 继承GenericServlet 3 继承HttpServlet 4 web.xml配置 关于servlet的创建,我们有三种方式. 实现Servlet接口 继承 ...
- B1041 考试座位号
每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位.正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座 ...
- Github如何创建添加开源许可license
我们点击项目上方的 Add file,选择 creat new file 名称填写 LICENSE, 右侧便会出现按钮 Choose a license template 选择你要的证书,填写 年份 ...
- odoo前端的Patch用法
一.Patching code:根据官方功能解释 我们需要自定义 UI 的工作方式.一些受支持的 API 涵盖了许多常见需求. 例如,所有注册表都是很好的扩展点: 字段注册表允许添加/删除专门的字段组 ...