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 相关文章推荐
Dom加载让图片加载完再执行的脚本代码
May 15 Javascript
JQuery AJAX提交中文乱码的解决方案
Jul 02 Javascript
Javascript控制input输入时间格式的方法
Jan 28 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(一)
May 17 Javascript
分享javascript、jquery实用代码段
Oct 20 Javascript
JS简单判断函数是否存在的方法
Feb 13 Javascript
vue 点击展开显示更多(点击收起部分隐藏)
Apr 09 Javascript
使用layui前端框架弹出form表单以及提交的示例
Oct 25 Javascript
vue实现配置全局访问路径头(axios)
Nov 01 Javascript
Quasar Input:type=&quot;number&quot; 去掉上下小箭头 实现加减按钮样式功能
Apr 09 Javascript
Vue表单提交点击事件只允许点击一次的实例
Oct 23 Javascript
ant design vue嵌套表格及表格内部编辑的用法说明
Oct 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
用PHP实现文件上传二法
2006/10/09 PHP
PHP 彩色文字实现代码
2009/06/29 PHP
php设置session值和cookies的学习示例
2014/03/21 PHP
php使用标签替换的方式生成静态页面
2015/05/21 PHP
PHP中的Iterator迭代对象属性详解
2019/04/12 PHP
Jquery 复选框取值兼容FF和IE8(测试有效)
2013/10/29 Javascript
Javascript:为input设置readOnly属性(示例讲解)
2013/12/25 Javascript
JavaScript实现的图像模糊算法代码分享
2014/04/22 Javascript
Bootstrap栅格系统的使用和理解2
2016/12/14 Javascript
JavaScript反射与依赖注入实例详解
2018/05/29 Javascript
服务端预渲染之Nuxt(使用篇)
2019/04/08 Javascript
微信小程序获取复选框全选反选选中的值(实例代码)
2019/12/17 Javascript
js实现鼠标点击页面弹出自定义文字效果
2019/12/24 Javascript
纯js+css实现仿移动端淘宝网站的弹出详情框功能
2019/12/29 Javascript
如何在Vue.JS中使用图标组件
2020/08/04 Javascript
[03:48]显微镜下的DOTA2第四期——TP动作
2014/06/20 DOTA
pygame实现弹力球及其变速效果
2017/07/03 Python
Python设计模式之门面模式简单示例
2018/01/09 Python
python的dataframe和matrix的互换方法
2018/04/11 Python
Python3匿名函数用法示例
2018/07/25 Python
在python中pandas的series合并方法
2018/11/12 Python
Python实现求两个数组交集的方法示例
2019/02/23 Python
python实现简单日志记录库glog的使用
2019/12/13 Python
python pandas利用fillna方法实现部分自动填充功能
2020/03/16 Python
python中return如何写
2020/06/18 Python
Python如何实现线程间通信
2020/07/30 Python
基于logstash实现日志文件同步elasticsearch
2020/08/06 Python
为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景
2021/01/05 Python
捷克厨房用品购物网站:Tescoma
2018/07/13 全球购物
初三开学计划书
2014/04/27 职场文书
电子专业毕业生自荐信
2014/05/25 职场文书
员工试用期自我评价
2014/09/18 职场文书
2014年党员整改措施范文
2014/09/21 职场文书
化验员岗位职责
2015/02/14 职场文书
2015年学校管理工作总结
2015/07/20 职场文书
MYSQL如何查看操作日志详解
2022/05/30 MySQL