溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JavaScript基于replace+正則實(shí)現(xiàn)ES6的字符串模版功能

發(fā)布時(shí)間:2020-10-03 03:16:23 來(lái)源:腳本之家 閱讀:295 作者:KongyunWu 欄目:web開(kāi)發(fā)

本文實(shí)例講述了JavaScript基于replace+正則實(shí)現(xiàn)ES6的字符串模版功能。分享給大家供大家參考,具體如下:

采用拼接字符串的形式,將 JSON 數(shù)據(jù)嵌入 HTML 中。開(kāi)始時(shí)代碼量較少,暫時(shí)還可以接受。但當(dāng)頁(yè)面結(jié)構(gòu)復(fù)雜起來(lái)后,其弱點(diǎn)開(kāi)始變得無(wú)法忍受起來(lái):

書(shū)寫(xiě)不連貫。每寫(xiě)一個(gè)變量就要斷一下,插入一個(gè) + 和 “。十分容易出錯(cuò)。

無(wú)法重用。HTML 片段都是離散化的數(shù)據(jù),難以對(duì)其中重復(fù)的部分進(jìn)行提取。

無(wú)法很好地利用 標(biāo)簽。這是 HTML5 中新增的一個(gè)標(biāo)簽,標(biāo)準(zhǔn)極力推薦將 HTML 模板放入 標(biāo)簽中,使代碼更簡(jiǎn)潔。

replace+正則實(shí)現(xiàn)

項(xiàng)目剛開(kāi)始用的數(shù)據(jù)拼接

function formatString() {
    if (arguments.length === 0)
      return null;
    var str = arguments[0];
    for (var i = 1; i < arguments.length; i++) {
      var re = new RegExp('\\{' + (i - 1) + '\\}', 'gm');
      str = str.replace(re, arguments[i]);
    }
    return str;
},

第一個(gè)參數(shù)為需要渲染的數(shù)據(jù)模板,其他參數(shù)為數(shù)據(jù):

formatString('{0},My name is {1}', 'everyMan', '吳孔云')

這種后期維護(hù)較麻煩,一旦更改順序,都需要更改~~就跟函數(shù)需要接收一大串參數(shù)一樣,我們盡量寫(xiě)成對(duì)象的形式,

var myObject = maker(f,l,m,c,s);//不建議寫(xiě)法
var myObject = maker({//建議寫(xiě)法
   first : f,
   last: l,
   state:s,
   city:c
});

在網(wǎng)上搜索看到一個(gè)例子,可以類(lèi)似實(shí)現(xiàn)ES6的字符串模版形式,博客是一個(gè)高中生寫(xiě)的,戳鏈接 。

function render(template, context) {
  //被轉(zhuǎn)義的的分隔符 { 和 } 不應(yīng)該被渲染,分隔符與變量之間允許有空白字符
  var tokenReg = /(\\)?\{([^\{\}\\]+)(\\)?\}/g;
  return template.replace(tokenReg, function (word, slash2, token, slash3) {
    //如果有轉(zhuǎn)義的\{或\}替換轉(zhuǎn)義字符
    if (slash2 || slash3) {
      return word.replace('\\', '');
    }
    // 切割 token ,實(shí)現(xiàn)級(jí)聯(lián)的變量也可以展開(kāi)
    var variables = token.replace(/\s/g, '').split('.');
    var currentObject = context;
    var i, length, variable;
    for (i = 0, length = variables.length; i < length; ++i) {
      variable = variables[i];
      currentObject = currentObject[variable];
      // 如果當(dāng)前索引的對(duì)象不存在,則直接返回空字符串。
      if (currentObject === undefined || currentObject === null) return '';
    }
    return currentObject;
  })
}
String.prototype.render = function (context) {
  return render(this, context);
};
"{greeting}! My name is { author.name }.".render({
  greeting: "Hi",
  author: {
    name: "hsfzxjy"
  }
});
// Hi! My name is hsfzxjy.

擴(kuò)展:ES6字符串模版API

ES6引入了一種新型的字符串字面量語(yǔ)法,我們稱(chēng)之為模板字符串(template strings)。除了使用反撇號(hào)字符 ` 代替普通字符串的引號(hào) ' 或 ” 外,它們看起來(lái)與普通字符串并無(wú)二致。

var a = 'kenny'
`my name is ${a}` //"my name is kenny"

可以用bable編譯成ES5。

PS:這里再為大家提供2款非常方便的正則表達(dá)式工具供大家參考使用:

JavaScript正則表達(dá)式在線測(cè)試工具:
http://tools.jb51.net/regex/javascript

正則表達(dá)式在線生成工具:
http://tools.jb51.net/regex/create_reg

更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《ECMAScript6(ES6)入門(mén)教程》、《JavaScript正則表達(dá)式技巧大全》、《JavaScript字符與字符串操作技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》

希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI