前端开发系列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 官网在线例子 ...
随机推荐
- AQS的acquire(int arg) 方法底层源码
一.定义 acquire(int arg) 是 AQS(AbstractQueuedSynchronizer)中的一个核心方法,用于在独占模式下获取同步状态.如果当前线程无法获取同步状态,则将其加入等 ...
- 说说 Java 的执行流程?
Java 的执行流程 Java 的执行流程包括多个阶段,从源码编写到最终程序的执行,涉及到编译.类加载.字节码执行.垃圾回收等多个环节.下面将详细介绍 Java 程序的执行流程. 1. 编写源代码 开 ...
- 搭建zookeeper集群常见的报错原因(总结)
N.1 报错:Connection broken for id 2, my id = 3, error = java.io.IOException: Channel eof ... 原因:server ...
- CF1424G题解
思路 这个题意思很显然,是求 nnn 个区间重叠最多的地方和值. 那么我们能想到用差分数组,在扫一遍的过程中维护最大值和 pospospos. 但是需要注意的是,区间最大会到 10910^9109,直 ...
- Missing Semester
计算机教育中缺失的一课 The Missing Semester of Your CS Education 文档:https://missing-semester-cn.github.io/ 网课:h ...
- 【深度学习】MLE视角下的VAE与DDPM损失函数推导
正文 最大似然估计的由来 VAE和DDPM都是likelihood-based生成模型,都是通过学习分布->采样实现图像生成的: 这类模型最大的特点就是希望实现 \[\theta = \arg\ ...
- 痞子衡嵌入式:聊聊i.MXRT1024/1064片内4MB Flash的SFDP表易丢失导致的烧录异常
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1024/1064片内4MB Flash的SFDP表易丢失导致的烧录异常. 我们知道 i.MXRT 系列本身并没有片内非易失 ...
- 接口测试策略(一、概念&流程&范围)
接口测试概要 接口测试概念 什么是接口测试? 维基百科对接口测试的定义如下: API testing is a type of software testing that involves testi ...
- Ubuntu下好用的工具
UML画图工具 推荐:Drawio 参考:https://blog.csdn.net/jsm1010/article/details/112920539 安装命令:sudo snap install ...
- python的多层包调用
在阅读tvm 前端代码时发现了诸如from ... import nd as _nd/from .. import analysis之类的代码,因长时间未接触python,感到格外好奇 参考:PEP ...