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 相关文章推荐
封装好的省市地区联动控件附下载
Aug 13 Javascript
新发现一个骗链接的方法(js读取cookies)
Jan 11 Javascript
JavaScript高级程序设计 阅读笔记(七) ECMAScript中的语句
Feb 27 Javascript
基于jQuery的360图片展示实现代码
Jun 14 Javascript
图片img的src不变让浏览器重新加载实现方法
Mar 29 Javascript
jQuery实现获取绑定自定义事件元素的方法
Dec 02 Javascript
js实现简单的验证码
Dec 25 Javascript
怎么引入(调用)一个JS文件
May 26 Javascript
JS实现简单的tab切换选项卡效果
Sep 21 Javascript
如何选择jQuery版本 1.x? 2.x? 3.x?
Apr 01 jQuery
Vue.js递归组件构建树形菜单
Dec 24 Javascript
js实现按钮开关单机下拉菜单效果
Nov 22 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
PHP4.04简明安装
2006/10/09 PHP
php explode函数实例代码
2012/02/27 PHP
PHP数据库调用类调用实例(详细注释)
2012/07/12 PHP
php中导出数据到excel时数字变为科学计数的解决方法
2013/02/03 PHP
PHP多线程编程之管道通信实例分析
2015/03/07 PHP
PHP5.2中PDO的简单使用方法
2016/03/25 PHP
php实现简单爬虫的开发
2016/03/28 PHP
Save a File Using a File Save Dialog Box
2007/06/18 Javascript
javascript 表单的友好用户体现
2009/01/07 Javascript
关于捕获用户何时点击window.onbeforeunload的取消事件
2011/03/06 Javascript
关于jQuery object and DOM element
2013/04/15 Javascript
jQuery判断复选框是否勾选的原理及示例
2014/05/21 Javascript
js实现进度条的方法
2015/02/13 Javascript
使用JavaScript 实现的人脸检测
2015/03/24 Javascript
JavaScript获取按钮所在form表单id的方法
2015/04/02 Javascript
BootStrap 超链接变按钮的实现方法
2016/09/25 Javascript
Angular4学习教程之DOM属性绑定详解
2018/01/04 Javascript
微信小程序实现自上而下字幕滚动
2018/07/14 Javascript
vue3.0 项目搭建和使用流程
2021/03/04 Vue.js
小结Python用fork来创建子进程注意事项
2014/07/03 Python
Python Web框架Flask中使用七牛云存储实例
2015/02/08 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
Python3 socket同步通信简单示例
2017/06/07 Python
浅谈使用Python变量时要避免的3个错误
2017/10/30 Python
pandas创建新Dataframe并添加多行的实例
2018/04/08 Python
关于ZeroMQ 三种模式python3实现方式
2019/12/23 Python
python中的subprocess.Popen()使用详解
2019/12/25 Python
python opencv 检测移动物体并截图保存实例
2020/03/10 Python
css3实现二维码扫描特效的示例
2020/10/29 HTML / CSS
医院辞职信范文
2014/01/17 职场文书
委托书范文
2014/04/02 职场文书
竞选团支书演讲稿
2014/04/28 职场文书
简单的离婚协议书范本
2014/11/16 职场文书
教代会开幕词
2015/01/28 职场文书
开学第一天的感想
2015/08/10 职场文书
小学英语教学反思范文
2016/02/15 职场文书