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 操作Word和Excel的实现代码
Oct 26 Javascript
js改变img标签的src属性在IE下没反应的解决方法
Jul 23 Javascript
js操作label给label赋值及取label的值示例
Nov 07 Javascript
用jquery实现动画跳到顶部和底部(这个比较简单)
Sep 01 Javascript
兼容主流浏览器的jQuery+CSS 实现遮罩层的简单代码
Oct 14 Javascript
js实现简单锁屏功能实例
May 27 Javascript
jQuery实现的自动加载页面功能示例
Sep 04 Javascript
Bootstrap3 内联单选和多选框
Dec 29 Javascript
jQuery+pjax简单示例汇总
Apr 21 jQuery
使用JavaScript生成罗马字符的实例代码
Jun 08 Javascript
高效jQuery选择器的5个技巧实例分析
Nov 26 jQuery
JavaScript实现简单的音乐播放器
Aug 14 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
php中in_array函数用法探究
2014/11/25 PHP
thinkphp中session和cookie无效的解决方法
2014/12/19 PHP
PHP读取汉字的点阵数据
2015/06/22 PHP
浅析PHP中的i++与++i的区别及效率
2016/06/15 PHP
php实现批量修改文件名称的方法
2016/07/23 PHP
Yii2.0中使用js异步删除示例
2017/03/10 PHP
PHP5.6新增加的可变函数参数用法分析
2017/08/25 PHP
优秀js开源框架-jQuery使用手册(1)
2007/03/10 Javascript
经常用的图片在容器中的水平垂直居中实例
2007/06/10 Javascript
“不能执行已释放的Script代码”错误的原因及解决办法
2007/09/09 Javascript
js汉字转拼音实现代码
2013/02/06 Javascript
总结Node.js中的一些错误类型
2016/08/15 Javascript
扩展bootstrap的modal模态框-动态添加modal框-弹出多个modal框
2017/02/21 Javascript
javascript 跨域问题以及解决办法
2017/07/17 Javascript
JS实现的base64加密解密操作示例
2018/04/18 Javascript
详解vue中点击空白处隐藏div的实现(用指令实现)
2018/04/19 Javascript
Vue 中的受控与非受控组件的实现
2018/12/17 Javascript
js DOM的事件常见操作实例详解
2019/12/16 Javascript
vue中实现图片压缩 file文件的方法
2020/05/28 Javascript
[01:14]英雄,所敬略同——2018完美盛典宣传视频4K
2018/12/05 DOTA
Python使用email模块对邮件进行编码和解码的实例教程
2016/07/01 Python
Python编程产生非均匀随机数的几种方法代码分享
2017/12/13 Python
python导出chrome书签到markdown文件的实例代码
2017/12/27 Python
Python中xml和json格式相互转换操作示例
2018/12/05 Python
详解Django admin高级用法
2019/11/06 Python
wxPython窗体拆分布局基础组件
2019/11/19 Python
Python实现微信好友的数据分析
2019/12/16 Python
Python3列表List入门知识附实例
2020/02/09 Python
意大利珠宝店:Luxury Zone
2019/01/05 全球购物
中东奢侈品市场:Coveti
2019/05/12 全球购物
热爱祖国的演讲稿
2014/05/04 职场文书
布达拉宫的导游词
2015/02/02 职场文书
求职简历自我评价怎么写
2015/03/10 职场文书
财务出纳岗位职责
2015/03/31 职场文书
2016七夕情人节感言
2015/12/09 职场文书
2016年小学生教师节广播稿
2015/12/18 职场文书