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


Posted in Javascript onApril 25, 2017

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

Javascript 相关文章推荐
Javascript 中的 &amp;&amp; 和 || 使用小结
Apr 25 Javascript
jquery绑定事件不生效的解决方法
Feb 11 Javascript
jQuery超酷平面式时钟效果代码分享
Mar 30 Javascript
深入理解jquery跨域请求方法
May 18 Javascript
JavaScript 数组some()和filter()的用法及区别
May 20 Javascript
javascript三种代码注释方法
Jun 02 Javascript
jQuery ajax中使用confirm,确认是否删除的简单实例
Jun 17 Javascript
Node.js 使用request模块下载文件的实例
Sep 05 Javascript
vue兄弟组件传递数据的实例
Sep 06 Javascript
关于vue-cli 3配置打包优化要点(推荐)
Apr 22 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
Jun 13 Javascript
vue实现页面滚动到底部刷新
Aug 16 Javascript
JS字符串按逗号和回车分隔的方法
Apr 25 #Javascript
使用Math.max,Math.min获取数组中的最值实例
Apr 25 #Javascript
JavaScript中 DOM操作方法小结
Apr 25 #Javascript
ES6正则的扩展实例详解
Apr 25 #Javascript
Javascript中八种遍历方法的执行速度深度对比
Apr 25 #Javascript
详谈js使用in和hasOwnProperty获取对象属性的区别
Apr 25 #Javascript
3分钟掌握常用的JS操作JSON方法总结
Apr 25 #Javascript
You might like
Smarty模板常见的简单应用分析
2016/11/15 PHP
几行代码轻松实现PHP文件打包下载zip
2017/03/01 PHP
掌握PHP垃圾回收机制详解
2019/03/13 PHP
用javascript父窗口控制只弹出一个子窗口
2007/04/10 Javascript
json跟xml的对比分析
2008/06/10 Javascript
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
用原生JS获取CLASS对象(很简单实用)
2014/10/15 Javascript
JavaScript定时器setTimeout()和setInterval()详解
2017/08/18 Javascript
微信小程序实现添加手机联系人功能示例
2017/11/30 Javascript
微信小程序学习笔记之获取位置信息操作图文详解
2019/03/29 Javascript
微信小程序实现多行文字超出部分省略号显示功能
2019/10/23 Javascript
vue路由 遍历生成复数router-link的例子
2019/10/30 Javascript
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
Vue和React有哪些区别
2020/09/12 Javascript
[38:32]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第二局
2016/02/26 DOTA
[02:10]探秘浦东源深体育馆 DOTA2 Supermajor不见不散
2018/05/17 DOTA
python使用win32com库播放mp3文件的方法
2015/05/30 Python
Python中矩阵库Numpy基本操作详解
2017/11/21 Python
基于DATAFRAME中元素的读取与修改方法
2018/06/08 Python
利用Python如何实现一个小说网站雏形
2018/11/23 Python
Python3爬楼梯算法示例
2019/03/04 Python
Python读取表格类型文件代码实例
2020/02/17 Python
django 外键创建注意事项说明
2020/05/20 Python
Python中免验证跳转到内容页的实例代码
2020/10/23 Python
Python Pandas list列表数据列拆分成多行的方法实现
2020/12/14 Python
一款利用纯css3实现的win8加载动画的实例分析
2014/12/11 HTML / CSS
html5模拟平抛运动(模拟小球平抛运动过程)
2013/07/25 HTML / CSS
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
uniapp+Html5端实现PC端适配
2020/07/15 HTML / CSS
意大利制造的男鞋和女鞋:SCAROSSO
2018/03/07 全球购物
一道SQL存储过程面试题
2016/10/07 面试题
班会关于环保演讲稿
2013/12/29 职场文书
陈欧的广告词
2014/03/18 职场文书
精神文明单位申报材料
2014/05/02 职场文书
小班下学期幼儿评语
2014/12/30 职场文书
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
2021/05/24 Python