最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS冷知識之不起眼但有用的String.raw方法

 更新時間:2022年06月08日 16:46:01   作者:掘金技術(shù)團(tuán)隊  
String.raw是JavaScript中模板字符串的一個標(biāo)簽函數(shù),它的作用是將模板字符串不轉(zhuǎn)義的原始字符串內(nèi)容返回,接下來通過本文給大家介紹JS冷知識之不起眼但有用的String.raw方法,需要的朋友可以參考下

String.raw

String.raw是JavaScript中模板字符串的一個標(biāo)簽函數(shù),它的作用是將模板字符串不轉(zhuǎn)義的原始字符串內(nèi)容返回。

也就是說,如下代碼:

console.log(String.raw`Hi!\nAkira`);

將直接返回字符串 Hi!\nAkira,而不是在Hi!Akira中間插入回車。因為String.raw標(biāo)簽存在,所以\n不被轉(zhuǎn)義。這樣其實相當(dāng)于如下代碼:

console.log(`Hi!\\nAkira`);

原始字符串不轉(zhuǎn)義,在某些情況下很有用。不知道大家有沒有遇到過用new RegExp動態(tài)構(gòu)建正則表達(dá)式的場景,比如下面的代碼構(gòu)建一個瀏覽器默認(rèn)塊級元素標(biāo)簽的正則匹配:

const blockTags = 'address|article|aside|base|basefont|blockquote|body|caption'
+ '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
+ '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
+ '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
+ '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'
+ '|track|ul';

const blockReg = new RegExp(`(<\\s*(?:(?:\\/\\s*(?:${blockTags})\\s*)|(?:(?:${blockTags})\\s*\\/\\s*)|hr)>\\s*?)\\n`, 'ig');

在這里,因為我們使用了new RegExp動態(tài)構(gòu)建,所以我們就要把\s替換成\\s,把\/替換成\\/,把\n替換成\\n。但如果使用String.raw,就可以不用這么替換,可以直接寫成:

const blockReg = new RegExp(String.raw`(<\s*(?:(?:\/\s*(?:${blockTags})\s*)|(?:(?:${blockTags})\s*\/\s*)|hr)>\s*?)\n`, 'ig');

除了動態(tài)構(gòu)建正則,還有輸出或執(zhí)行代碼塊的場景,比如:

const script = `
    console.log('test \n test');
`
execScript(script);

上面這段代碼執(zhí)行會出錯,因為\n在字符串字面量中被替換成換行,導(dǎo)致實際執(zhí)行的代碼變成下面這樣:

console.log('test 
 test');

因為單引號字符串里面不能插入換行,所以上面的代碼執(zhí)行就報錯了。

解決的辦法是:

const script = String.raw`
    console.log('test \n test');
`
execScript(script);

這樣就可以避免字符串代碼的轉(zhuǎn)義內(nèi)容被解析。

所以,從上面可以看出,在字符串解析的場景下,String.raw就會有用。比如我們要寫一個使用KaTeX解析公式的React組件,我們希望這么使用:

<Katex macros={{...}}>
    公式字符串
</Katex>

具體實現(xiàn)我們可以這樣寫:

import katex from 'katex';
import React from 'react';
import ReactDOM from 'react-dom'; 

const Katex = ({children, ...props}) => {
  const code = katex.renderToString(children, {
    ...props,
    throwOnError: false
  })
  return (
    <span dangerouslySetInnerHTML={{__html: code}}/>
  )
}

對于單行公式的解析沒有問題

<Katex>x^2+y^2=1</Katex>

能夠正確解析成:x2+y2=1x^2+y^2=1x2+y2=1

但是如果是多行公式:

<Katex macros={{"\\f": "#1f(#2)"}}>
% \f is defined as #1f(#2) using the macro
\f\relax{x} = \int_{-\infty}^\infty
    \f\hat\xi\,e^{2 \pi i \xi x}
    \,d\xi
</Katex>

這么寫是不行的,因為React在解析JSX的時候,會把內(nèi)容中的回車去掉,空格合并,就像瀏覽器解析HTML標(biāo)簽?zāi)菢?,而且也不能正確處理轉(zhuǎn)義符。所以如果像上面這么寫,最后瀏覽器會報錯。

這時候,我們就可以使用String.raw標(biāo)簽,將上面的代碼寫成下面這樣:

<Katex macros={{"\\f": "#1f(#2)"}}>{String.raw`
% \f is defined as #1f(#2) using the macro
\f\relax{x} = \int_{-\infty}^\infty
    \f\hat\xi\,e^{2 \pi i \xi x}
    \,d\xi
`}</Katex>

這樣KaTeX就能正確解析字符串內(nèi)容了,最終實現(xiàn)效果如下:

https://code.juejin.cn/pen/7106683225786810376

自定義標(biāo)簽

除了默認(rèn)的String.raw,我們自定義的標(biāo)簽函數(shù),也可以通過strings.raw來獲得原始字符串內(nèi)容,所以我們也可以將KaTeX公式解析定義成標(biāo)簽函數(shù):

function KaTeX(strings, macros) {
  return katex.renderToString(strings.raw.join(''), {
    macros,
    throwOnError: false
  });
}

這樣我們就可以通過標(biāo)簽函數(shù)來解析公式,再用React渲染出來:

https://code.juejin.cn/pen/7106726810817462286

以上就是全部內(nèi)容,雖然很簡單,但是非常有用。

你還知道或用過String.raw以及其他標(biāo)簽函數(shù)嗎?歡迎在評論區(qū)討論。

到此這篇關(guān)于JS冷知識不起眼但有用的String.raw方法的文章就介紹到這了,更多相關(guān)javascript string.raw方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 微信小程序跨頁面數(shù)據(jù)傳遞事件響應(yīng)實現(xiàn)過程解析

    微信小程序跨頁面數(shù)據(jù)傳遞事件響應(yīng)實現(xiàn)過程解析

    這篇文章主要介紹了微信小程序跨頁面數(shù)據(jù)傳遞事件響應(yīng)實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • js頁面加載后執(zhí)行的幾種方式小結(jié)

    js頁面加載后執(zhí)行的幾種方式小結(jié)

    在實際應(yīng)用中往往需要在頁面加載完畢之后再去執(zhí)行相關(guān)的js代碼,之所以這么操作是有道理的,如果是操作dom元素,如果相關(guān)元素沒有加載完成,而去執(zhí)行js代碼,可能會導(dǎo)致錯誤
    2020-01-01
  • 微信小程序?qū)崿F(xiàn)Swiper輪播圖效果

    微信小程序?qū)崿F(xiàn)Swiper輪播圖效果

    這篇文章主要介紹了微信小程序?qū)崿F(xiàn)Swiper輪播圖效果,文中示例代碼介紹的非常詳細(xì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • JS中showModalDialog 的使用解析

    JS中showModalDialog 的使用解析

    JS中showModalDialog 的使用解析,需要的朋友可以參考一下
    2013-04-04
  • js 剪切板的用法(clipboardData.setData)與js match函數(shù)介紹

    js 剪切板的用法(clipboardData.setData)與js match函數(shù)介紹

    這篇文章主要是對js中剪切板的使用方法(clipboardData.setData)與js中的match函數(shù)進(jìn)行了介紹。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-11-11
  • Js 獲取HTML DOM節(jié)點元素的方法小結(jié)

    Js 獲取HTML DOM節(jié)點元素的方法小結(jié)

    在Web應(yīng)用程序特別是Web2.0程序開發(fā)中,經(jīng)常要獲取頁面中某個元素,然后更新該元素的樣式、內(nèi)容等。
    2009-04-04
  • JavaScript中使用數(shù)組方法匯總

    JavaScript中使用數(shù)組方法匯總

    這篇文章主要介紹了JavaScript中使用數(shù)組方法匯總的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • 常見JS前端接口校驗方式總結(jié)

    常見JS前端接口校驗方式總結(jié)

    作為一名優(yōu)秀的接口調(diào)用工程師,對接口的返回信息進(jìn)行校驗是必不可少的,本文整理的是一些常用的校驗方式,希望能夠?qū)Υ蠹矣兴鶐椭?/div> 2023-05-05
  • Uncaught?SyntaxError:Unexpected?token?'<'?(at?xxx.js)解決分析

    Uncaught?SyntaxError:Unexpected?token?'<'?(

    這篇文章主要為大家介紹了JS判斷趨近于直線的多邊形(退化多邊形)實例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Typescript協(xié)變與逆變簡單理解

    Typescript協(xié)變與逆變簡單理解

    深入學(xué)習(xí)TypeScript類型系統(tǒng)的話,逆變、協(xié)變、雙向協(xié)變、不變是繞不過去的概念。這些概念看起來挺高大上的,其實并不復(fù)雜,這篇文章我們就來學(xué)習(xí)下協(xié)變和逆變吧
    2022-10-10

最新評論

遂溪县| 上栗县| 青海省| 青岛市| 壶关县| 杭锦后旗| 黄梅县| 五家渠市| 穆棱市| 壶关县| 道真| 双辽市| 贡山| 龙南县| 香格里拉县| 大冶市| 普兰县| 通城县| 长治市| 夹江县| 荔浦县| 松阳县| 泗阳县| 雷山县| 昌黎县| 牡丹江市| 陆河县| 台北县| 武冈市| 巴林右旗| 厦门市| 通海县| 康保县| 凤山县| 新建县| 新田县| 鄂温| 天等县| 夏河县| 双柏县| 图们市|