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 = {'&': '&amp;','<': '&lt;','>': '&gt;','"': '&quot;',"'": '&#39;'};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: &lt;script&gt;alert(&quot;XSS!&quot;);&lt;/script&gt;"

        在这个例子中,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攻击。

码字不易,各位大佬点点赞

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/65973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【论文阅读+复现】High-fidelity Person-centric Subject-to-Image Synthesis

以人物为中心的主体到图像的高保真合成&#xff0c;CVPR2024 code&#xff1a;CodeGoat24/Face-diffuser: [CVPR2024] Official implementation of High-fidelity Person-centric Subject-to-Image Synthesis. paper&#xff1a;2311.10329 背景 研究问题&#xff1a;这篇文…

详解如何自定义 Android Dex VMP 保护壳

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 前言 Android Dex VMP&#xff08;Virtual Machine Protection&#xff0c;虚拟机保护&#xff09;壳是一种常见的应用保护技术&#xff0c;主要用于保护 And…

基于华为atlas的重车(满载)空车(空载)识别

该教程主要是想摸索出华为atlas的基于ACL的推理模式。最终实现通过煤矿磅道上方的摄像头&#xff0c;识别出车辆的重车&#xff08;满载&#xff09;、空车&#xff08;空载&#xff09;情况。本质上是一个简单的检测问题。 但是整体探索过程比较坎坷&#xff0c;Tianxiaomo的…

《零基础Go语言算法实战》【题目 2-25】goroutine 的执行权问题

《零基础Go语言算法实战》 【题目 2-25】goroutine 的执行权问题 请说明以下这段代码为什么会卡死。 package main import ( "fmt" "runtime" ) func main() { var i byte go func() { for i 0; i < 255; i { } }() fmt.Println("start&quo…

IntelliJ IDEA中Maven项目的配置、创建与导入全攻略

大家好&#xff0c;我是袁庭新。 IntelliJ IDEA是当前最流行的Java IDE&#xff08;集成开发环境&#xff09;之一&#xff0c;也是业界公认最好用的Java开发工具之一。IntelliJ IDEA支持Maven的全部功能&#xff0c;通过它我们可以很轻松地实现创建Maven项目、导入Maven项目、…

【Rust】函数

目录 思维导图 1. 函数的基本概念 1.1 函数的定义 2. 参数的使用 2.1 单个参数的示例 2.2 多个参数的示例 3. 语句与表达式 3.1 语句与表达式的区别 3.2 示例 4. 带返回值的函数 4.1 返回值的示例 4.2 返回值与表达式 5. 错误处理 5.1 错误示例 思维导图 1. 函数…

Cython全教程2 多种定义方式

—— 本篇文章&#xff0c;主要讲述Cython中的四种定义关键字 全教程2 多种定义方式&#xff1a; 在Cython中&#xff0c;关于定义的关键字有四个&#xff0c;分别是&#xff1a; cdef、def、cpdef、DEF 一、cdef定义关键字 顾名思义&#xff0c;cdef关键字定义的是一个C函数…

Web开发(一)HTML5

Web开发&#xff08;一&#xff09;HTML5 写在前面 参考黑马程序员前端Web教程做的笔记&#xff0c;主要是想后面自己搭建网页玩。 这部分是前端HTML5CSS3移动web视频教程的HTML5部分。主要涉及到HTML的基础语法。 HTML基础 标签定义 HTML定义 HTML(HyperText Markup Lan…

Java-数据结构-栈与队列(常考面试题与单调栈)

在上一篇的学习中&#xff0c;我们学习了栈和队列的基本知识&#xff0c;以及它们对应都有哪些方法&#xff0c;在什么应用场景下如何使用&#xff0c;并且还对它们进行了模拟实现&#xff0c;而其实对于栈和队列的相关知识还远不止于此&#xff0c;而今天我们就对栈与队列进行…

Spring 项目 基于 Tomcat容器进行部署

文章目录 一、前置知识二、本地Idea运行Spring项目1. 将写好的 Spring 项目先打包成 war 包2. 查看项目工件&#xff08;Artifact&#xff09;是否存在3. 配置 Tomcat3.1 添加一个本地 Tomcat 容器3.2 将项目部署到 Tomcat 4. 运行项目 三、基于 Tomcat 部署及多实例部署1. Spr…

usbredir学习

文章目录 背景典型场景编译usbredirparserusbredirfilterusbredirparser/usbredirproto usbredirhostusbredirect/usbredirtestclient参考 背景 usbredir 是一种用于通过网络转发 USB 设备流量的网络协议。它也是一个软件包的名称&#xff0c;该软件包提供了一个解析库、一个 …

ESXI 安装教程(3) ---​vCenter Server 安装

不涉及复杂的操作此项可不安装 1.镜像加载到虚拟光盘 对应的网盘文件 2.打开文件路径 双击运行文件installer.exe 3.调整安装语言 4.点击安装 5. 6. 证书,有效问题导致此提示,非专业网络管理人员,不知道如何处理,此处点是即可 证书有效开始时间是安装时间8小时 证书有效结束…

极客说|Azure AI Agent Service 结合 AutoGen/Semantic Kernel 构建多智能体解决⽅案

作者&#xff1a;卢建晖 - 微软高级云技术布道师 「极客说」 是一档专注 AI 时代开发者分享的专栏&#xff0c;我们邀请来自微软以及技术社区专家&#xff0c;带来最前沿的技术干货与实践经验。在这里&#xff0c;您将看到深度教程、最佳实践和创新解决方案。关注「极客说」&am…

【集成学习】Boosting算法详解

文章目录 1. 集成学习概述2. Boosting算法详解3. Gradient Boosting算法详解3.1 基本思想3.2 公式推导 4. Python实现 1. 集成学习概述 集成学习&#xff08;Ensemble Learning&#xff09;是一种通过结合多个模型的预测结果来提高整体预测性能的技术。相比于单个模型&#xf…

小米vela系统(基于开源nuttx内核)——如何使用信号量进行PV操作

如何使用信号量进行PV操作 前言信号量1. 信号量简介2. NuttX中信号量的创建与使用2.1 Nuttx信号量的初始化和销毁2.2 信号量的等待和发布 3. 信号量的实际应用&#xff1a;下载任务示例3.1 实际代码3.2 代码说明3.3 执行说明 4. 信号量的优势与应用场景5. 常见应用场景&#xf…

CMake学习笔记(2)

1. 嵌套的CMake 如果项目很大&#xff0c;或者项目中有很多的源码目录&#xff0c;在通过CMake管理项目的时候如果只使用一个CMakeLists.txt&#xff0c;那么这个文件相对会比较复杂&#xff0c;有一种化繁为简的方式就是给每个源码目录都添加一个CMakeLists.txt文件&#xff…

【C++】size_t究竟是什么?全面解析与深入拓展

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;一、什么是size_t&#xff1f;为什么需要size_t&#xff1f; &#x1f4af;二、size_t的特性与用途1. size_t是无符号类型示例&#xff1a; 2. size_t的跨平台适应性示例对…

【物流管理系统 - IDEAJavaSwingMySQL】基于Java实现的物流管理系统导入IDEA教程

有问题请留言或私信 步骤 下载项目源码&#xff1a;项目源码 解压项目源码到本地 打开IDEA 左上角&#xff1a;文件 → 新建 → 来自现有源代码的项目 找到解压在本地的项目源代码文件&#xff0c;点击确定&#xff0c;根据图示步骤继续导入项目 查看项目目录&#xff…

ssh2-sftp-client和ssh2配合使用js脚本快速部署项目到服务器

有时候因为服务器不能实现github或者gitlab的自动部署服务&#xff0c;所以就需要使用脚本来实现自动部署&#xff0c;可以省时省力&#xff0c;一劳永逸。这里就使用ssh2-sftp-client和ssh2来实现&#xff0c;即便是需要sudo权限&#xff0c;也是可以的。 1.先将本地打包后的…

深度解析Linux中的调试器gdb/cgdb的使用

Linux下我们编译好的代码&#xff0c;无法直接调试 gcc/g默认的工作模式是realse模式 程序要调试的话&#xff0c;必须是debug模式&#xff0c;也就是说编译的时候要加-g选项 gdb携带调试信息的exe 我们现在在文件夹里面创建一个文件lesson11 里面创建一个累加的代码&…