你不知道的JS?ES6字符串標(biāo)簽函數(shù)分享
前言
字符串標(biāo)簽函數(shù)是一種特殊的函數(shù)調(diào)用語法,它賦予開發(fā)人員處理模板字面量的能力,從而以更加靈活和控制的方式生成和操作字符串。本文將深入探討ES6中字符串標(biāo)簽函數(shù)的工作原理,并結(jié)合具體的代碼示例展示它在字符串格式化、國際化、模板解析和生成,以及自定義字符串操作等方面的威力。
工作原理
字符串標(biāo)簽函數(shù)通過在模板字面量前面使用函數(shù)名進(jìn)行調(diào)用。當(dāng)調(diào)用模板字面量時(shí),JavaScript引擎會(huì)將模板字面量分解為多個(gè)字符串和表達(dá)式部分,并將這些部分作為參數(shù)傳遞給字符串標(biāo)簽函數(shù)。標(biāo)簽函數(shù)可以根據(jù)需要處理這些參數(shù),并返回處理后的結(jié)果。
案例
1. 字符串格式化
這段代碼展示了一個(gè)字符串標(biāo)簽函數(shù)的示例,用于將價(jià)格格式化為人民幣形式。
function formatCurrency(strings, ...values) { // strings 參數(shù)是一個(gè)字符串?dāng)?shù)組,包含模板字面量中的字符串部分 // values 參數(shù)是一個(gè)數(shù)組,包含模板字面量中的表達(dá)式部分的值 // 將模板字面量中的字符串和表達(dá)式部分拼接在一起,并格式化價(jià)格為人民幣形式 return strings[0] + values[0].toLocaleString('en-US', { style: 'currency', currency: 'CNY' }); } const price = 42.99; const formatted = formatCurrency`The price is: ${price}`; console.log(formatted); // 輸出: "The price is: CN¥42.99"
formatCurrency
函數(shù)接收一個(gè)字符串?dāng)?shù)組 strings
和一個(gè)值數(shù)組 values
作為參數(shù),分別包含了模板字面量中的字符串部分和表達(dá)式部分的值。
在函數(shù)內(nèi)部,我們首先將模板字面量中的第一個(gè)字符串 strings[0]
追加到最終的結(jié)果字符串中,即 "The price is: "
。
然后,我們訪問值數(shù)組 values
中的第一個(gè)值 values[0]
,即價(jià)格。通過調(diào)用 toLocaleString
方法,我們將價(jià)格格式化為人民幣形式。我們傳遞了一個(gè)選項(xiàng)對象作為參數(shù),其中 style
設(shè)置為 'currency'
表示格式化為貨幣形式,currency
設(shè)置為 'CNY'
表示使用人民幣作為貨幣單位。
最后,我們將格式化后的價(jià)格字符串追加到最終的結(jié)果字符串中。
在示例中,我們將價(jià)格值設(shè)置為 42.99
,并調(diào)用 formatCurrency
函數(shù),將模板字面量 The price is: ${price}
作為參數(shù)傳遞給字符串標(biāo)簽函數(shù)。
函數(shù)的執(zhí)行過程中,將字符串 "The price is: "
追加到結(jié)果字符串中。接著,通過 toLocaleString
方法將價(jià)格值 42.99
格式化為人民幣形式,結(jié)果為 "¥42.99"
。然后,將格式化后的價(jià)格字符串追加到最終的結(jié)果字符串中。
最終,輸出的結(jié)果是 "The price is: ¥42.99"
,實(shí)現(xiàn)了將價(jià)格格式化為人民幣形式的功能。
2. 國際化和本地化
這段代碼展示了一個(gè)字符串標(biāo)簽函數(shù)的示例,用于根據(jù)當(dāng)前語言環(huán)境進(jìn)行翻譯
function translate(strings, ...values) { const lang = 'en'; // 假設(shè)當(dāng)前語言為英語 const translations = { 'Hello': '你好', 'world': '世界' }; let result = ''; strings.forEach((string, index) => { result += string; if (values[index] !== undefined) { result += translations[values[index]] || values[index]; } }); return result; } const greeting = translate`${'Hello'}, ${'world'}!`; console.log(greeting); // 輸出: "你好, 世界!"
translate
函數(shù)接收一個(gè)字符串?dāng)?shù)組 strings
和一個(gè)值數(shù)組 values
作為參數(shù),分別包含了模板字面量中的字符串部分和表達(dá)式部分的值。
在函數(shù)內(nèi)部,我們定義了一個(gè)名為 lang
的變量,假設(shè)其值為 'en'
,表示當(dāng)前語言為英語。同時(shí),我們定義了一個(gè)名為 translations
的對象,其中包含了一些常見詞匯的翻譯映射。
然后,我們使用 forEach
方法遍歷 strings
數(shù)組。對于每個(gè)字符串,我們將其追加到最終的結(jié)果字符串 result
中。然后,我們檢查對應(yīng)的 values
數(shù)組中是否存在值。如果存在,則嘗試從 translations
對象中查找對應(yīng)的翻譯值,如果找到了翻譯,則將翻譯結(jié)果追加到最終的字符串中;否則,將原始值追加到最終的字符串中。
最后,我們返回生成的最終字符串。
在示例中,我們調(diào)用 translate
函數(shù),將模板字面量 Hello, ${'world'}!
作為參數(shù)傳遞給字符串標(biāo)簽函數(shù)。
函數(shù)的執(zhí)行過程中,將字符串 'Hello, '
追加到結(jié)果字符串中。接著,檢查表達(dá)式部分的值 'world'
,并在 translations
對象中查找對應(yīng)的翻譯。由于我們假設(shè)當(dāng)前語言為英語,而翻譯對象中包含了 'Hello'
和 'world'
的翻譯映射,所以將 '你好'
和 '世界'
分別追加到最終的字符串中。
最終,輸出的結(jié)果是 "你好, 世界!"
,實(shí)現(xiàn)了根據(jù)當(dāng)前語言環(huán)境進(jìn)行翻譯的功能。
3. 模板解析和生成
代碼展示了一個(gè)簡單的字符串標(biāo)簽函數(shù)的示例,用于生成報(bào)告。
function generateReport(strings, ...values) { // strings 參數(shù)是一個(gè)字符串?dāng)?shù)組,包含模板字面量中的字符串部分 // values 參數(shù)是一個(gè)數(shù)組,包含模板字面量中的表達(dá)式部分的值 let report = ''; for (let i = 0; i < strings.length; i++) { report += strings[i]; if (values[i] !== undefined) { // 將模板字面量中的表達(dá)式部分的值添加到報(bào)告字符串中 report += values[i]; } } return report; } const name = '張三'; const age = 28; const report = generateReport`Name: ${name}, Age: ${age}`; console.log(report); // 輸出: "Name: 張三, Age: 28"
generateReport
函數(shù)接收一個(gè)字符串?dāng)?shù)組 strings
和一個(gè)值數(shù)組 values
作為參數(shù),分別包含了模板字面量中的字符串部分和表達(dá)式部分的值。
在函數(shù)內(nèi)部,我們使用一個(gè)循環(huán)來遍歷 strings
數(shù)組。對于每個(gè)字符串,我們將其追加到報(bào)告字符串 report
中。然后,我們檢查對應(yīng)的 values
數(shù)組中是否存在值。如果存在,則將值追加到報(bào)告字符串中。
最后,我們返回生成的報(bào)告字符串。
在示例中,我們定義了一個(gè)名為 name
的變量,其值為 '張三'
,還定義了一個(gè)名為 age
的變量,其值為 28
。然后,我們調(diào)用 generateReport
函數(shù),將模板字面量 Name: ${name}, Age: ${age}
作為參數(shù)傳遞給字符串標(biāo)簽函數(shù)。
函數(shù)的執(zhí)行過程中,將字符串 'Name: '
追加到報(bào)告字符串中,然后將變量 name
的值 '張三'
追加到報(bào)告字符串中。接著,將字符串 ', Age: '
追加到報(bào)告字符串中,再將變量 age
的值 28
追加到報(bào)告字符串中。
最終,輸出的結(jié)果是 "Name: 張三, Age: 28"
,其中包含了模板字面量中的字符串部分和表達(dá)式部分的值。
這樣,我們通過使用字符串標(biāo)簽函數(shù),可以輕松地根據(jù)模板生成自定義的報(bào)告字符串。
4. 自定義字符串操作
展示了一個(gè)自定義的字符串標(biāo)簽函數(shù)的示例,用于進(jìn)行特定的字符串操作
function customOperation(strings, ...values) { // strings 參數(shù)是一個(gè)字符串?dāng)?shù)組,包含模板字面量中的字符串部分 // values 參數(shù)是一個(gè)數(shù)組,包含模板字面量中的表達(dá)式部分的值 let result = ''; strings.forEach((string, index) => { // 將字符串部分轉(zhuǎn)換為大寫,并將結(jié)果拼接到最終的字符串中 result += string.toUpperCase(); if (values[index] !== undefined) { // 將表達(dá)式部分的值拼接到最終的字符串中 result += values[index]; } }); return result; } const text = 'hello'; const modified = customOperation`Original text: ${text}`; console.log(modified); // 輸出: "ORIGINAL TEXT: hello"
customOperation
函數(shù)接收一個(gè)字符串?dāng)?shù)組 strings
和一個(gè)值數(shù)組 values
作為參數(shù),分別包含了模板字面量中的字符串部分和表達(dá)式部分的值。
在函數(shù)內(nèi)部,我們使用 forEach
方法遍歷 strings
數(shù)組。對于每個(gè)字符串,我們將其轉(zhuǎn)換為大寫形式,并將結(jié)果追加到最終的字符串 result
中。然后,我們檢查對應(yīng)的 values
數(shù)組中是否存在值。如果存在,則將值追加到最終的字符串中。
最后,我們返回生成的最終字符串。
在示例中,我們定義了一個(gè)名為 text
的變量,其值為 'hello'
。然后,我們調(diào)用 customOperation
函數(shù),將模板字面量 Original text: ${text}
作為參數(shù)傳遞給字符串標(biāo)簽函數(shù)。
函數(shù)的執(zhí)行過程中,將字符串 'Original text: '
轉(zhuǎn)換為大寫形式,并將結(jié)果追加到最終的字符串中。接著,將變量 text
的值 'hello'
追加到最終的字符串中。
最終,輸出的結(jié)果是 "ORIGINAL TEXT: hello"
,其中包含了模板字面量中的字符串部分和表達(dá)式部分的值。
這樣,我們可以根據(jù)特定的業(yè)務(wù)邏輯對模板字面量進(jìn)行自定義的字符串操作,例如轉(zhuǎn)換為大寫、添加特定的前綴或后綴等。
到此這篇關(guān)于你不知道的JS ES6字符串標(biāo)簽函數(shù)分享的文章就介紹到這了,更多相關(guān)JS ES6字符串標(biāo)簽函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js獲取當(dāng)前年月日-YYYYmmDD格式的實(shí)現(xiàn)代碼
下面小編就為大家?guī)硪黄猨s獲取當(dāng)前年月日-YYYYmmDD格式的實(shí)現(xiàn)代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06JS實(shí)現(xiàn)的DOM插入節(jié)點(diǎn)操作示例
這篇文章主要介紹了JS實(shí)現(xiàn)的DOM插入節(jié)點(diǎn)操作,結(jié)合實(shí)例形式分析了javascript針對頁面dom元素動(dòng)態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-04-04HTML頁面滾動(dòng)時(shí)獲取離頁面頂部的距離2種實(shí)現(xiàn)方法
獲取離滾動(dòng)頁面的頂部距離有兩種方法一是DOM;而是jquery,具體的實(shí)現(xiàn)如下,感興趣的朋友可以嘗試操作下2013-09-09js當(dāng)一個(gè)變量為函數(shù)時(shí) 應(yīng)該注意的一點(diǎn)細(xì)節(jié)小結(jié)
變量testFun為一個(gè)匿名函數(shù),匿名函數(shù)返回的一個(gè)testFun.init對象(也是一個(gè)匿名函數(shù))2011-12-12用js實(shí)現(xiàn)手把手教你月入萬刀(轉(zhuǎn)貼)
用js實(shí)現(xiàn)手把手教你月入萬刀(轉(zhuǎn)貼)...2007-11-11封裝一個(gè)vue中也可使用的uniapp的全局彈窗組件(任何頁面都可以彈出)
在寫uniapp小程序的時(shí)候,彈窗提醒經(jīng)常會(huì)用到,雖然彈窗的組件很多,但是通常別人封裝好的彈窗組件自定義度不高,很難匹配自己的ui需求,這篇文章主要給大家介紹了封裝一個(gè)vue中也可使用的uniapp的全局彈窗組件的相關(guān)資料,這個(gè)組件在任何頁面都可以彈出,需要的朋友可以參考下2023-02-02javascript實(shí)現(xiàn)固定側(cè)邊欄
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)固定側(cè)邊欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-02-02使用重寫url機(jī)制實(shí)現(xiàn)驗(yàn)證碼換一張功能
重寫URL機(jī)制:為了保證一個(gè)url的地址唯一,可每次向服務(wù)器傳遞的參數(shù)不一樣即可。此處在實(shí)現(xiàn)驗(yàn)證碼的換一張的功能時(shí),就是利用了改變參數(shù)列表的值進(jìn)行刷新。具體詳細(xì)代碼大家參考下本文2017-08-08