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.pswp.cn/web/65973.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65973.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65973.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux 容器漏洞

定義&#xff1a;Linux 容器漏洞是指在容器技術&#xff08;如 Docker、LXC 等&#xff09;運行環境中存在的安全弱點。這些漏洞可能存在于容器鏡像本身、容器運行時&#xff08;如 runc&#xff09;、容器編排工具&#xff08;如 Kubernetes&#xff09;或者容器與主機之間的交…

【論文閱讀+復現】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項目、…

TypeScript語言的學習路線

TypeScript語言的學習路線 TypeScript&#xff08;TS&#xff09;是由Microsoft開發的一種開源編程語言&#xff0c;是JavaScript的超集&#xff0c;提供了嚴格的類型檢查和基于類的面向對象編程特性。隨著前端開發的不斷進步&#xff0c;TypeScript逐漸成為了現代前端開發的主…

計算機網絡之---靜態路由與動態路由

靜態路由 靜態路由是由網絡管理員手動配置并固定的路由方式。路由器通過靜態配置的路由條目來轉發數據包&#xff0c;而不會自動調整。它不依賴于任何路由協議。 特點&#xff1a; 手動配置&#xff1a;網絡管理員需要手動在路由器中配置每條靜態路由。不自動更新&#xff1a;…

【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…

MATLAB學習筆記目錄

MATLAB學習筆記-生成純音并保存-CSDN博客 MATLAB學習筆記-各種格式之間的轉換 - 知乎 MATLAB學習筆記-胞組&#xff08;cell array&#xff09;轉換為矩陣&#xff0c;cell2mat_matlab如何把元胞數組改為矩陣-CSDN博客MATLAB學習筆記-判斷數組、結構體、數值、字符串是否相同…

Java-數據結構-棧與隊列(常考面試題與單調棧)

在上一篇的學習中&#xff0c;我們學習了棧和隊列的基本知識&#xff0c;以及它們對應都有哪些方法&#xff0c;在什么應用場景下如何使用&#xff0c;并且還對它們進行了模擬實現&#xff0c;而其實對于棧和隊列的相關知識還遠不止于此&#xff0c;而今天我們就對棧與隊列進行…

JSON.stringify(res,null,2)的含義

JSON.stringify(res, null, 2) 是 JavaScript 中將對象轉換為 JSON 字符串的方法&#xff0c;具體說明如下&#xff1a; 參數解釋 res&#xff1a;要轉換的對象。它可以是 JavaScript 中的任意類型&#xff0c;如對象、數組、字符串、數字等。例如&#xff0c;{name: "K…

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小時 證書有效結束…

【初識掃盲】逆概率加權

我們正在處理一個存在缺失數據的回歸模型&#xff0c;并且希望采用一種非參數的逆概率加權方法來調整估計&#xff0c;以應對這種缺失數據的情況。 首先&#xff0c;我們需要明確問題的背景。我們有樣本 { ( Y i , X i , r i ) : i 1 , … , n } \left\{\left(Y_i, \boldsym…

極客說|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…