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 相关文章推荐
cnblogs TagCloud基于jquery的实现代码
Jun 11 Javascript
jquery中的$(document).ready()使用小结
Feb 14 Javascript
jquery删除指定的html标签并保留标签内文本内容的方法
Apr 02 Javascript
js中string转int把String类型转化成int类型
Aug 13 Javascript
jQuery图片切换动画效果
Feb 28 Javascript
element ui里dialog关闭后清除验证条件方法
Feb 26 Javascript
vue.js的computed,filter,get,set的用法及区别详解
Mar 08 Javascript
JS中用EL表达式获取上下文参数值的方法
Mar 28 Javascript
React SSR样式及SEO的实践
Oct 22 Javascript
layer.open回调获取弹出层参数的实现方法
Sep 10 Javascript
webpack打包html里面img后src为“[object Module]”问题
Dec 22 Javascript
Vue文本模糊匹配功能如何实现
Jul 30 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入门小知识
2008/03/24 PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
2020/02/12 PHP
TNC vs BOOM BO3 第一场2.13
2021/03/10 DOTA
JQuery中判断一个元素下面是否有内容或者有某个标签的判断代码
2012/02/02 Javascript
Raphael一个用于在网页中绘制矢量图形的Javascript库
2013/01/08 Javascript
js获取或设置当前窗口url参数的小例子
2013/10/14 Javascript
二叉树的非递归后序遍历算法实例详解
2014/02/07 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
2015/03/02 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
浅谈$(document)和$(window)的区别
2015/07/15 Javascript
JS实现Ajax的方法分析
2016/12/20 Javascript
将input框中输入内容显示在相应的div中【三种方法可选】
2017/05/08 Javascript
vue2.0的contextmenu右键弹出菜单的实例代码
2017/07/24 Javascript
webpack 单独打包指定JS文件的方法
2018/02/22 Javascript
Vue.js+Layer表格数据绑定与实现更新的实例
2018/03/07 Javascript
vue实现文字横向无缝走马灯组件效果的实例代码
2019/04/09 Javascript
关于JSON解析的实现过程解析
2019/10/08 Javascript
如何用vue-cli3脚手架搭建一个基于ts的基础脚手架的方法
2019/12/12 Javascript
js实现计时器秒表功能
2019/12/16 Javascript
PYTHON正则表达式 re模块使用说明
2011/05/19 Python
zookeeper python接口实例详解
2018/01/18 Python
Python 使用 prettytable 库打印表格美化输出功能
2019/12/26 Python
使用python matploblib库绘制准确率,损失率折线图
2020/06/16 Python
为中国消费者甄选天下优品:网易严选
2016/08/11 全球购物
Aquatalia官网:意大利著名鞋履品牌
2019/09/26 全球购物
缓刑人员的思想汇报
2014/01/11 职场文书
小学作文评语大全
2014/04/21 职场文书
优秀语文教师事迹
2014/05/18 职场文书
篮球比赛口号
2014/06/10 职场文书
装修施工安全责任书
2014/07/24 职场文书
行风评议整改报告
2014/11/06 职场文书
申报材料格式
2014/12/30 职场文书
2015年度企业工作总结
2015/05/21 职场文书
研究生论文答辩开场白
2015/05/27 职场文书
给校长的建议书作文400字
2015/09/14 职场文书
redis配置文件中常用配置详解
2021/04/14 Redis