JavaScript

超轻量级php框架startmvc

JavaScript基于replace+正则实现ES6的字符串模版功能

更新时间:2020-05-08 13:36:01 作者:startmvc
本文实例讲述了JavaScript基于replace+正则实现ES6的字符串模版功能。分享给大家供大家参考,

本文实例讲述了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。

PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:

JavaScript正则表达式在线测试工具: http://tools.jb51.net/regex/javascript

正则表达式在线生成工具: http://tools.jb51.net/regex/create_reg

JavaScript replace 正则 ES6 字符串模版