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 相关文章推荐
对YUI扩展的Gird组件 Part-1
Mar 10 Javascript
用 Javascript 验证表单(form)中多选框(checkbox)值
Sep 08 Javascript
输入框的字数时时统计—关于 onpropertychange 和 oninput 使用
Oct 21 Javascript
JS中获取数据库中的值的方法
Jul 14 Javascript
js获取通过ajax返回的map型的JSONArray的方法
Jan 09 Javascript
jQuery判断对象是否存在的方法
Feb 05 Javascript
老生常谈onBlur事件与onfocus事件(js)
Jul 09 Javascript
H5用户注册表单页 注册模态框!
Sep 17 Javascript
微信小程序 地图(map)实例详解
Nov 16 Javascript
JS重学系列之聊聊new操作符
Mar 04 Javascript
eslint 的三大通用规则详解
May 16 Javascript
JavaScript如何实现防止重复的网络请求的示例
Jan 28 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
虫族 ZERG 概述
2020/03/14 星际争霸
IStream与TStream之间的相互转换
2008/08/01 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
2015/10/22 PHP
分享PHP计算两个日期相差天数的代码
2015/12/23 PHP
既简单又安全的PHP验证码 附调用方法
2016/06/02 PHP
laravel学习教程之关联模型
2016/07/30 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
javascript优先加载笔记代码
2008/09/30 Javascript
JS实现简单的键盘打字的效果
2015/04/24 Javascript
jQuery如何封装输入框插件
2016/08/19 Javascript
Angular.JS实现无限级的联动菜单(使用demo)
2017/02/08 Javascript
vue写一个组件
2018/04/09 Javascript
JavaScript检查数据中是否存在相同的元素(两种方法)
2018/10/07 Javascript
Koa代理Http请求的示例代码
2018/10/10 Javascript
vue axios封装及API统一管理的方法
2019/04/18 Javascript
js验证身份证号码记录的方法
2019/04/26 Javascript
解决layui使用layui-icon出现默认图标的问题
2019/09/11 Javascript
node脚手架搭建服务器实现token验证的方法
2021/01/20 Javascript
Python Web服务器Tornado使用小结
2014/05/06 Python
Python os模块学习笔记
2015/06/21 Python
python简单分割文件的方法
2015/07/30 Python
Python读取一个目录下所有目录和文件的方法
2016/07/15 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
2018/12/06 Python
浅谈Python的条件判断语句if/else语句
2019/03/21 Python
python 将日期戳(五位数时间)转换为标准时间
2019/07/11 Python
Python3读写ini配置文件的示例
2020/11/06 Python
Python Selenium库的基本使用教程
2021/01/04 Python
Foot Locker德国官方网站:美国运动服和鞋类零售商
2018/11/01 全球购物
竞选演讲稿范文
2013/12/28 职场文书
四好少年事迹材料
2014/01/12 职场文书
后勤主管岗位职责
2014/03/01 职场文书
2014年寒假社会实践活动心得体会
2014/04/07 职场文书
房屋租赁合同解除协议书
2014/10/11 职场文书
python tkinter模块的简单使用
2021/04/07 Python
关于JavaScript轮播图的实现
2021/11/20 Javascript
Windows 11上手初体验:任务栏和开始菜单等迎来大改
2021/11/21 数码科技