ES6的高阶语法特性
一、模板字符串的高级用法
1.1.模板字符串的嵌套
模板字符串的嵌套允许在一个模板字符串内部再嵌入一个或多个模板字符串。这种嵌套结构在处理复杂数据结构或生成具有层级关系的文本时非常有用。
1. 嵌套示例
假设我们有一个包含多个对象的数组,每个对象都有名称、描述和价格属性。我们可以使用嵌套的模板字符串来生成一个包含这些对象信息的表格
const products = [{ name: 'Product A', description: 'This is product A', price: 100 },{ name: 'Product B', description: 'This is product B', price: 200 }
];const tmpl = products => `<table border="1"><tr><th>Name</th><th>Description</th><th>Price</th></tr>${products.map(product => `<tr><td>${product.name}</td><td>${product.description}</td><td>${product.price.toFixed(2)}</td></tr>`).join('')}</table>
`;console.log(tmpl(products));
在这个例子中,内部的模板字符串用于生成每个表格行的内容,而外部的模板字符串则负责将这些行组合成一个完整的HTML表格。
2. 嵌套深度
模板字符串的嵌套深度可以根据需要调整。例如,如果我们的数据结构包含多层嵌套的对象或数组,我们可以相应地增加模板字符串的嵌套层级
const nestedData = [{id: 1,name: 'Category 1',items: [{ id: 101, name: 'Item 1-1', price: 50 },{ id: 102, name: 'Item 1-2', price: 60 }]},{id: 2,name: 'Category 2',items: [{ id: 201, name: 'Item 2-1', price: 70 },{ id: 202, name: 'Item 2-2', price: 80 }]}
];const nestedTmpl = nestedData => `<ul>${nestedData.map(category => `<li><h2>${category.name}</h2><ul>${category.items.map(item => `<li>${item.name} - $${item.price.toFixed(2)}</li>`).join('')}</ul></li>`).join('')}</ul>
`;console.log(nestedTmpl(nestedData));
在这个例子中,我们有一个包含类别和项目的嵌套数据结构。我们使用嵌套的模板字符串来生成一个包含这些类别和项目的HTML列表。
1.2.标签模板的详细分析
标签模板是一种特殊的函数调用,它允许对模板字符串进行自定义处理。标签模板函数接收一个字符串数组(由模板字符串中的静态文本部分组成)和一个包含模板字符串中表达式求值结果的剩余参数列表。
1.字符串格式化
标签模板函数可以用于实现复杂的字符串格式化逻辑。例如,我们可以创建一个函数来格式化货币金额
function formatCurrency(strings, ...values) {const currencySymbol = '$';const decimalPlaces = 2;return strings.reduce((result, str, idx) => {result += str;if (idx < values.length) {result += `${currencySymbol}${values[idx].toFixed(decimalPlaces)}`;}return result;}, '');
}const price = 1234.5678;
console.log(formatCurrency`The price is ${price}`); // 输出 "The price is $1234.57"
在这个例子中,formatCurrency
函数接收一个模板字符串和一个或多个值。它遍历模板字符串的静态文本部分和值,将每个值格式化为货币金额,并将结果组合成一个完整的字符串。
2. 自定义插值逻辑
标签模板函数不仅可以用于简单的字符串插值,还可以对插入的变量或表达式进行自定义处理。例如,我们可以创建一个函数来将插入的字符串转换为大写,并在其前后添加特定的标记:
function customInterpolate(strings, ...values) {return strings.reduce((result, str, idx) => {result += str;if (idx < values.length) {result += `[${values[idx].toUpperCase()}]`;}return result;}, '');
}const text = 'hello';
console.log(customInterpolate`This is a ${text} world!`);
// 输出 "This is a [HELLO] world!"
在这个例子中,customInterpolate
函数接收一个模板字符串和一个或多个值。它遍历模板字符串的静态文本部分和值,将每个值转换为大写,并在其前后添加方括号作为标记,然后将结果组合成一个完整的字符串。
3. 防止XSS攻击
在处理用户输入时,标签模板函数还可以用于防止跨站脚本攻击(XSS)。通过自定义处理函数,我们可以对用户输入进行HTML转义,从而避免潜在的XSS漏洞。
function escapeHTMLTags(strings, ...values) {const escapeMap = {'&': '&','<': '<','>': '>','"': '"',"'": '''};const escape = (str) => str.replace(/[&<>"']/g, (char) => escapeMap[char]);return strings.reduce((result, str, idx) => {result += str;if (idx < values.length) {result += escape(values[idx]);}return result;}, '');
}const userInput = '<script>alert("XSS!");</script>';
console.log(escapeHTMLTags`Safe input: ${userInput}`);
// 输出 "Safe input: <script>alert("XSS!");</script>"
在这个例子中,escapeHTMLTags
函数接收一个模板字符串和一个或多个值。它遍历模板字符串的静态文本部分和值,对每个值进行HTML转义,并将结果组合成一个安全的字符串。这样,即使用户输入包含恶意代码,也不会被执行,从而防止了XSS攻击。
模板字符串的嵌套和标签模板功能为字符串的格式化、插值等操作提供了极大的灵活性和便利性。在实际开发中,我们可以根据具体需求选择合适的模板字符串用法来优化代码的可读性和可维护性。同时,我们还需要注意处理用户输入时的安全性问题,避免潜在的XSS漏洞.
1.3.模板字符串嵌套的深入探索
1.深度嵌套与性能优化
当模板字符串嵌套到非常深的层次时,可能会带来性能上的开销。这是因为每次嵌套都会创建一个新的字符串,而字符串在JavaScript中是不可变的这意味着每次操作都会生成一个新的字符串对象。因此,在处理大量数据或深度嵌套的结构时,需要注意性能优化。
一种优化方法是尽量减少不必要的嵌套,或者使用其他数据结构(如数组或对象)来组织数据,然后再通过循环或递归的方式生成最终的字符串。
2. 动态模板生成
在某些情况下,我们可能需要根据运行时条件动态地生成模板字符串。这可以通过使用函数来返回模板字符串,并在函数中根据条件拼接不同的字符串片段来实现。
例如,我们可以编写一个函数来根据用户权限生成不同的页面内容
function generatePageContent(userRole) {return `<div><h1>Welcome to Our Website</h1>${userRole === 'admin' ? `<div><h2>Admin Panel</h2><!-- Admin-specific content --></div>` : `<div><h2>User Panel</h2><!-- User-specific content --></div>`}</div>`;
}
generatePageContent
函数根据userRole
的值返回不同的模板字符串
3. 与其他JavaScript特性的结合
模板字符串可以与其他JavaScript特性(如模板字面量类型、箭头函数、解构赋值等)结合使用,以实现更复杂的逻辑和更简洁的代码。
例如,我们可以使用模板字面量类型和箭头函数来创建一个函数,该函数接收一个对象并返回格式化的字符串
const formatPerson = ({ name, age, occupation }) => `Name: ${name}Age: ${age}Occupation: ${occupation}
`;console.log(formatPerson({ name: 'John Doe', age: 30, occupation: 'Engineer' }));
1.4.标签模板的深入探索
1. 自定义标签函数的高级用法
标签模板函数不仅可以用于简单的字符串插值,还可以实现更复杂的逻辑,如条件渲染、循环、国际化(i18n)等。
例如,我们可以编写一个自定义标签函数来实现条件渲染:
function conditionalRender(strings, ...values) {return strings.reduce((result, str, idx) => {result += str;if (idx < values.length) {const value = values[idx];result += typeof value === 'function' && value() ? '' : `[${value}]`;}return result;}, '');
}const condition = true;
console.log(conditionalRender`This is a ${condition ? 'true' : () => 'false'} statement.`); // 输出 "This is a true statement."
// 注意:这里的例子有点简化,实际使用中可能需要更复杂的逻辑来处理函数和值的混合情况。
然而,上面的例子并不完全展示了标签模板函数的强大之处。在实际应用中,我们可能会传递更复杂的值(如对象、数组等)给标签模板函数,并在函数内部进行更复杂的处理。
2. 与第三方库的集成
标签模板函数可以与第三方库集成,以实现更强大的功能。例如,我们可以使用
intl-messageformat
库来实现国际化
import IntlMessageFormat from 'intl-messageformat';const msg = IntlMessageFormat('Hello, {name}!', 'en', { name: 'John' });
console.log(msg.format()); // 输出 "Hello, John!"
虽然这个例子没有直接使用标签模板语法,但intl-messageformat
库的设计灵感部分来源于标签模板,它允许我们以一种类似模板字符串的方式来定义和格式化国际化消息。
3. 性能与安全性考虑
与模板字符串嵌套类似,标签模板函数在处理大量数据或复杂逻辑时也可能带来性能开销。因此,需要注意性能优化,如避免不必要的计算、使用缓存等。
此外,在处理用户输入时,标签模板函数也需要考虑安全性问题。例如,如果标签模板函数接收用户输入并直接插入到HTML中,那么就需要进行HTML转义以防止XSS攻击。
码字不易,各位大佬点点赞
相关文章:
ES6的高阶语法特性
一、模板字符串的高级用法 1.1.模板字符串的嵌套 模板字符串的嵌套允许在一个模板字符串内部再嵌入一个或多个模板字符串。这种嵌套结构在处理复杂数据结构或生成具有层级关系的文本时非常有用。 1. 嵌套示例 假设我们有一个包含多个对象的数组,每个对象都有名称、…...

GO:GO程序如何处理缓存加载和大数据缓存
如果我们会在程序启动时,需要加载所有数据,最简单的方式就是程序启动,通过轮训从数据库拉取所有数据,并写入到本地缓存中。 问题:数据量较大的时候,程序加载慢,启动时间长,遇到问题不…...
时序数据库TDengine 3.3.5.0 发布:高并发支持与增量备份功能引领新升级
近日,TDengine 3.3.5.0 版本正式发布,带来了多项重磅更新与优化,从功能拓展到性能提升,再到用户体验进行了全面改进。本次更新围绕用户核心需求展开,涵盖了开发工具、数据管理、安全性、可视化等多个层面,为…...
信息系统项目管理-采购管理-采购清单示例
序号类别产品/服务名称规格/功能描述数量备注1硬件服务器高性能处理器,大容量存储10HP、DELL2网络设备高速路由器和交换机10华为3工作站多核处理器,高分辨率显示器25国产设备4移动检查设备手持式移动检查仪,可连接云平台30国产设备5打印机和扫…...

python识别图片中指定颜色的图案并保存为图片
示例代码: def chuli(color):import cv2import numpy as np# 定义颜色名称到HSV阈值范围的映射color_thresholds {red: ([0, 100, 100], [10, 255, 255], [160, 100, 100], [180, 255, 255]),yellow: ([20, 100, 100], [30, 255, 255]),blue: ([90, 100, 100], [1…...

【git命令行】git pull冲突如何使用stash暂存,不提交当前工作的情况下临时保存修改
1、git add . 暂存区暂存 2、git stash save "message" 保存当前工作目录的临时状态,并将其存储为一个新的stash 3 、git pull 重新拉取 4、**git stash pop**吐出之前暂存的改动,git stash clear 清空所有暂存...

浏览器输入http形式网址后自动跳转https解决方法
一、问题描述 使用浏览器 网上冲浪 时会遇到一个情况: 在浏览器中输入“http域名”后会自动变成“https 域名”的形式,此时“https 域名”的网站可能已停止对外提供服务了,这时会出现如下不友好的网页提示: 二、处理方法&#x…...
BertTokenizerFast 和 BertTokenizer 的区别
BertTokenizerFast 和 BertTokenizer 都是用于对文本进行标记化的工具,主要用于处理和输入文本数据以供 BERT 模型使用。它们都属于 HuggingFace 的 transformers 库。 主要区别 底层实现: BertTokenizer: 这是一个使用纯 Python 实现的标记器ÿ…...

【update 更新数据语法合集】.NET开源ORM框架 SqlSugar 系列
系列文章目录 🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀 文章目录 系列文章目录前言 🍃一、实体对象更新1.1 单条与批量1.2 不更新某列1.3 只更新某列1.4 NULL列不更新1.5 无主键/指定列…...
测试人员面试需要掌握的内容
测试人员面试需要掌握的内容 1、在公司的测试流程是什么? 产品经理确认本次版本的需求,召开需求评审会,进行估时排期,需求和时间都确定之后,UI出设计图,开发人员进行开发,测试人员编写测试用例…...

git 新建分支并推到远程分支
在git或者码云上创建一个项目管理,已经存在主分支,现在需要创建一个其他分支; 具体操作: 1. 查看分支情况 git branch 2. 查看分支状态 git status 3. 一次性创建并切换到本地分支 git checkout -b dev 分步骤创建和切换&…...

【Uniapp-Vue3】showLoading加载和showModal模态框示例
一、showLoading加载 uni.showLoading({ title:"标题", // 其他配置 }); uni.hideLoading(); showLoading开启后不会自动关闭,只能手动配置uni.hideLoading() 来关闭加载框。 二、showModel模态框 uni.showModel({ title:"标题", // 其他配置 …...
PythonOpenCV图片识别
在windows下面,使用python opencv 进行识别,获取到坐标。 依赖安装: pip install opencv-python pip install numpy pip install pyautogui pip install pywin32代码: import cv2 import numpy as np import pyautogui import o…...
构建优雅、高效的 Nodejs 命令行工具 - Archons
目录 项目简介安装基本用法样例创建一个简单的命令行工具使用archons上下文创建进度条 最后 项目地址: https://github.com/noctisynth/archons Bug反馈或功能请求:https://github.com/noctisynth/archons/issues 项目简介 Archons意思是“执政官”,我使…...
你喜欢用什么编辑器?
电脑工作者和程序员所使用的文本编辑器通常需要具备高效率、易用性以及对代码友好等特点,包括语法高亮、自动完成、多文件同时编辑、查找替换、版本控制集成等功能。以下是几个广受开发者欢迎且实用性较强的文本编辑器: Visual Studio Code(V…...

鸿蒙报错Init keystore failed: keystore password was incorrect
报错如下: > hvigor ERROR: Failed :entry:defaultSignHap... > hvigor ERROR: Tools execution failed. 01-13 16:35:55 ERROR - hap-sign-tool: error: Init keystore failed: keystore password was incorrect * Try the following: > The key stor…...

【Flink】Flink内存管理
Flink内存整体结构图: JobManager内存管理 JVM 进程总内存(Total Process Memory)Flink总内存(Total Flink Memory):JVM进程总内存减去JVM Metaspace(元空间)和JVM Overhead(运行时开销)上图解释: JVM进程总内存为2G;JVM运行时开销(JVM Overh…...

JVM:ZGC详解(染色指针,内存管理,算法流程,分代ZGC)
1,ZGC(JDK21之前) ZGC 的核心是一个并发垃圾收集器,所有繁重的工作都在Java 线程继续执行的同时完成。这极大地降低了垃圾收集对应用程序响应时间的影响。 ZGC为了支持太字节(TB)级内存,设计了基…...
Docker常用命令大全
Docker容器相关命令: 创建并启动容器: docker run:创建一个新的容器并运行一个命令。例如:docker run -d -p 8080:80 nginx这将后台(-d)运行一个Nginx容器,并映射宿主机的8080端口到容器的80端口。 列出容器&#x…...

(12)springMVC文件的上传
SpringMVC文件上传 首先是快速搭建一个springMVC项目 新建项目mvn依赖导入添加webMoudle添加Tomcat运行环境.在配置tomcat时ApplicationContext置为"/"配置Artfact的lib配置WEB-INF配置文件(记得添加乱码过滤)配置springmvc-servlet文件&…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...