javascript的replace+正則 實現ES6的字符串模版

採用拼接字符串的形式,將 JSON 數據嵌入 HTML 中。開始時代碼量較少,暫時還可以接受。但當頁面結構複雜起來後,其弱點開始變得無法忍受起來:

  • 書寫不連貫。每寫一個變量就要斷一下,插入一個 + 和 “。十分容易出錯。

  • 無法重用。HTML 片段都是離散化的數據,難以對其中重複的部分進行提取。

  • 無法很好地利用 標籤。這是 HTML5 中新增的一個標籤,標準極力推薦將 HTML 模板放入 標籤中,使代碼更簡潔。

replace+正則實現

項目剛開始用的數據拼接

     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;
    },

第一個參數爲需要渲染的數據模板,其他參數爲數據:

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

這種後期維護較麻煩,一旦更改順序,都需要更改~~就跟函數需要接收一大串參數一樣,我們儘量寫成對象的形式,

var myObject = maker(f,l,m,c,s);//不建議寫法

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

在網上搜索看到一個例子,可以類似實現ES6的字符串模版形式,博客是一個高中生寫的,戳鏈接

function render(template, context) {

    //被轉義的的分隔符 { 和 } 不應該被渲染,分隔符與變量之間允許有空白字符
    var tokenReg = /(\\)?\{([^\{\}\\]+)(\\)?\}/g;

    return template.replace(tokenReg, function (word, slash1, token, slash2) {
        //如果有轉義的\{或\}替換轉義字符
        if (slash1 || slash2) {  
            return word.replace('\\', '');
        }

        // 切割 token ,實現級聯的變量也可以展開
        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];
            // 如果當前索引的對象不存在,則直接返回空字符串。
            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.

擴展:ES6字符串模版API

ES6引入了一種新型的字符串字面量語法,我們稱之爲模板字符串(template strings)。除了使用反撇號字符 ` 代替普通字符串的引號 ’ 或 ” 外,它們看起來與普通字符串並無二致。

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

可以用bable編譯成ES5。

發佈了48 篇原創文章 · 獲贊 29 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章