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 相关文章推荐
iis6+javascript Add an Extension File
Jun 13 Javascript
在JS数组特定索引处指定位置插入元素
Jul 27 Javascript
JS基于面向对象实现的放烟花效果
May 07 Javascript
JS+CSS实现简单的二级下拉导航菜单效果
Sep 21 Javascript
Javascript实现检测客户端类型代码封包
Dec 03 Javascript
JavaScript setTimeout使用闭包功能实现定时打印数值
Dec 18 Javascript
jQuery电话号码验证实例
Jan 05 Javascript
node文件批量重命名的方法示例
Oct 23 Javascript
理顺8个版本vue的区别(小结)
Sep 17 Javascript
Egg Vue SSR 服务端渲染数据请求与asyncData
Nov 24 Javascript
vue实现简单跑马灯效果
May 25 Javascript
小程序实现录音功能
Sep 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
php cli 方式 在crotab中运行解决
2010/02/08 PHP
php array_filter除去数组中的空字符元素
2020/06/21 PHP
基于PHP制作验证码
2016/10/12 PHP
关于Laravel Route重定向的一个注意点
2017/01/16 PHP
php遍历目录下文件并按修改时间排序操作示例
2019/07/12 PHP
使用JSON.parse将json字符串转换成json对象的时候会出错
2014/09/04 Javascript
原生javascript实现DIV拖拽并计算重复面积
2015/01/02 Javascript
js时间戳转为日期格式的方法
2015/12/28 Javascript
jQuery技巧之让任何组件都支持类似DOM的事件管理
2016/04/05 Javascript
BootStrap智能表单实战系列(七)验证的支持
2016/06/13 Javascript
javascript正则表达式模糊匹配IP地址功能示例
2017/01/06 Javascript
JavaScript实现公历转农历功能示例
2017/02/13 Javascript
JavaScript 跨域之POST实现方法
2018/05/07 Javascript
解决vue脚手架项目打包后路由视图不显示的问题
2018/09/20 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
微信小程序点击按钮动态切换input的disabled禁用/启用状态功能
2020/03/07 Javascript
VUE+elementui组件在table-cell单元格中绘制微型echarts图
2020/04/20 Javascript
weui上传多图片,压缩,base64编码的示例代码
2020/06/22 Javascript
Python 批量合并多个txt文件的实例讲解
2018/05/08 Python
numpy中的delete删除数组整行和整列的实例
2018/05/09 Python
Python实现计算字符串中出现次数最多的字符示例
2019/01/21 Python
详解Python中的各种转义符\n\r\t
2019/07/10 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
2019/11/11 Python
Python之多进程与多线程的使用
2021/02/23 Python
CSS3实现千变万化的文字阴影text-shadow效果设计
2016/04/26 HTML / CSS
Bootstrap 学习分享
2012/11/12 HTML / CSS
白俄罗斯在线大型超市:e-dostavka.by
2019/07/25 全球购物
工作表现自我评价
2014/02/08 职场文书
学习三严三实心得体会
2014/10/13 职场文书
学生保证书
2015/01/16 职场文书
中秋客户感谢信
2015/01/22 职场文书
为什么node.js不适合大型项目
2021/04/28 Javascript
Java循环队列与非循环队列的区别总结
2021/06/22 Java/Android
SQL实现LeetCode(176.第二高薪水)
2021/08/04 MySQL
MySQL优化常用的19种有效方法(推荐!)
2022/03/17 MySQL
Redis 异步机制
2022/05/15 Redis