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高级程序设计(第3版)学习笔记 概述
Oct 11 Javascript
简单的两种Extjs formpanel加载数据的方式
Nov 09 Javascript
jquery引用方法时传递参数原理分析
Oct 13 Javascript
jQuery中ajax的load()方法用法实例
Dec 26 Javascript
javascript实现PC网页里的拖拽效果
Mar 14 Javascript
基于jQuery实现表格的排序
Dec 02 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
Aug 04 jQuery
Angularjs按需查询实例代码
Oct 30 Javascript
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
May 17 Javascript
js canvas实现画图、滤镜效果
Nov 27 Javascript
Vue 实现前端权限控制的示例代码
Jul 09 Javascript
JavaScript实现飞舞的泡泡效果
Feb 07 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原理的opcodes(操作码)
2010/10/26 PHP
thinkPHP实现将excel导入到数据库中的方法
2016/04/22 PHP
php获得文件夹下所有文件的递归算法的简单实例
2016/11/01 PHP
php实现的中文分词类完整实例
2017/02/06 PHP
JavaScript Base64编码和解码,实现URL参数传递。
2006/09/18 Javascript
广泛收集的jQuery拖放插件集合
2012/04/09 Javascript
javascript中的startWith和endWith的几种实现方法
2013/05/07 Javascript
jquery用get实现ajax在ie里面刷新不进入后台解决方法
2013/08/12 Javascript
event对象获取方法总结在google浏览器下测试
2013/11/03 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
2015/02/20 Javascript
javascript连续赋值问题
2015/07/08 Javascript
Bootstrap Paginator+PageHelper实现分页效果
2018/12/29 Javascript
微信小程序与公众号实现数据互通的方法
2019/07/25 Javascript
Element-UI中关于table表格的那些骚操作(小结)
2019/08/15 Javascript
微信小程序自定义菜单切换栏tabbar组件代码实例
2019/12/30 Javascript
利用打码兔和超人打码自封装的打码类分享
2014/03/16 Python
python与C互相调用的方法详解
2017/07/14 Python
PyQt5每天必学之切换按钮
2020/08/20 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
2019/12/19 Python
CSS3 text-shadow实现文字阴影效果
2016/02/24 HTML / CSS
CSS3 实现的缩略图悬停效果
2020/12/09 HTML / CSS
英国领先的男士服装和时尚零售商:Burton
2017/01/09 全球购物
澳大利亚便宜的家庭购物网站:CrazySales
2018/02/06 全球购物
十佳大学生村官事迹
2014/01/09 职场文书
十佳大学生事迹材料
2014/01/29 职场文书
大学生求职工作的自我评价
2014/02/13 职场文书
暑期培训班招生方案
2014/08/26 职场文书
公务员党员评议表自我鉴定
2014/09/14 职场文书
个人反四风对照检查材料思想汇报
2014/09/23 职场文书
党的群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
乡镇法制宣传日活动总结
2015/05/05 职场文书
小学远程教育工作总结
2015/08/13 职场文书
学习新党章心得体会2016
2016/01/15 职场文书
《亲亲我的妈妈》观后感(3篇)
2019/09/26 职场文书
MySQL中的布尔值,怎么存储false或true
2021/06/04 MySQL
Python IO文件管理的具体使用
2022/03/20 Python