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 事件参考手册
Dec 24 Javascript
分享8款优秀的 jQuery 加载动画和进度条插件
Oct 24 Javascript
动态的绑定事件addEventListener方法的使用
Jan 24 Javascript
Node.js(安装,启动,测试)
Jun 09 Javascript
javascript中函数作为参数调用的方法
Feb 09 Javascript
JavaScript SweetAlert插件实现超酷消息警告框
Jan 28 Javascript
Angular.js与Bootstrap相结合实现表格分页代码
Apr 12 Javascript
微信小程序 教程之小程序配置
Oct 17 Javascript
js时间戳与日期格式之间相互转换
Dec 11 Javascript
vue中的模态对话框组件实现过程
May 01 Javascript
基于vue.js实现分页查询功能
Dec 29 Javascript
如何在现代JavaScript中编写异步任务
Jan 31 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
下载文件的点击数回填
2006/10/09 PHP
php array_merge下进行数组合并的代码
2008/07/22 PHP
通过JS 获取Mouse Position(鼠标坐标)的代码
2009/09/21 Javascript
jQuery之排序组件的深入解析
2013/06/19 Javascript
如何设置一定时间内只能发送一次请求
2014/02/28 Javascript
分享一个常用的javascript静态类
2014/12/31 Javascript
jquery实现submit提交表单
2015/02/03 Javascript
jQuery中animate动画第二次点击事件没反应
2015/05/07 Javascript
基于Jquery easyui 选中特定的tab
2015/11/17 Javascript
Node.js编写爬虫的基本思路及抓取百度图片的实例分享
2016/03/12 Javascript
关于js原型的面试题讲解
2016/09/25 Javascript
bootstrap——bootstrapTable实现隐藏列的示例
2017/01/14 Javascript
Vue axios 中提交表单数据(含上传文件)
2017/07/06 Javascript
JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解
2017/10/25 Javascript
JavaScript实现图片懒加载的方法分析
2018/07/05 Javascript
angular2组件中定时刷新并清除定时器的实例讲解
2018/08/31 Javascript
vue观察模式浅析
2018/09/25 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
2019/05/26 Javascript
layui递归实现动态左侧菜单
2019/07/26 Javascript
vue使用svg文件补充-svg放大缩小操作(使用d3.js)
2020/09/22 Javascript
python发腾讯微博代码分享
2014/01/10 Python
Python+OpenCV人脸检测原理及示例详解
2020/10/19 Python
python使用suds调用webservice接口的方法
2019/01/03 Python
在Python 不同级目录之间模块的调用方法
2019/01/19 Python
10分钟用python搭建一个超好用的CMDB系统
2019/07/17 Python
Python3 tkinter 实现文件读取及保存功能
2019/09/12 Python
pyhton中__pycache__文件夹的产生与作用详解
2019/11/24 Python
CSS3教程:新增加的结构伪类
2009/04/02 HTML / CSS
欧洲最大的滑雪假期供应商之一:Sunweb Holidays
2018/01/06 全球购物
小区门卫管理制度
2014/01/29 职场文书
工作决心书范文
2014/03/11 职场文书
青年安全生产示范岗事迹材料
2014/05/04 职场文书
2014年创卫工作总结
2014/11/24 职场文书
毕业生的自我鉴定表范文
2019/05/16 职场文书
CSS完成视差滚动效果
2021/04/27 HTML / CSS
Python中如何处理常见报错
2022/01/18 Python