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文件&…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
