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 相关文章推荐
获取URL地址中的文件名和参数的javascript代码
Sep 02 Javascript
JQuery为textarea添加maxlength属性的代码
Apr 07 Javascript
jquery中实现标签切换效果的代码
Mar 01 Javascript
微信小程序获取循环元素id以及wx.login登录操作
Aug 17 Javascript
webpack学习笔记之优化缓存、合并、懒加载
Aug 24 Javascript
Vue中封装input组件的实例详解
Oct 17 Javascript
select2 ajax 设置默认值,初始值的方法
Aug 09 Javascript
微信小程序支付前端源码
Aug 29 Javascript
在LayUI图片上传中,解决由跨域问题引起的请求接口错误的方法
Sep 24 Javascript
小程序瀑布流组件实现翻页与图片懒加载
May 19 Javascript
vue-i18n实现中英文切换的方法
Jul 06 Javascript
JS实现百度搜索框
Feb 25 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
一个简单的自动发送邮件系统(一)
2006/10/09 PHP
PHP递归遍历指定目录的文件并统计文件数量的方法
2015/03/24 PHP
php使用正则验证中文
2016/04/06 PHP
php生成网页桌面快捷方式
2017/05/05 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
2017/09/22 PHP
js宝典学习笔记(上)
2007/01/10 Javascript
用JS操作FRAME中的IFRAME及其内容的实现代码
2008/07/26 Javascript
js解析与序列化json数据(一)json.stringify()的基本用法
2013/02/01 Javascript
js购物车实现思路及代码(个人感觉不错)
2013/12/23 Javascript
纯JS实现动态时间显示代码
2014/02/08 Javascript
红米手机抢购的js代码
2014/03/10 Javascript
Web程序员必备的7个JavaScript函数
2016/06/14 Javascript
基于BootStrap实现局部刷新分页实例代码
2016/08/08 Javascript
对js中回调函数的一些看法
2016/08/29 Javascript
JS根据生日月份和日期计算星座的简单实现方法
2016/11/24 Javascript
Bootstrap源码解读下拉菜单(4)
2016/12/23 Javascript
javascript实现下雨效果
2017/03/27 Javascript
浅谈react.js 之 批量添加与删除功能
2017/04/17 Javascript
Bootstrap里的文件分别代表什么意思及其引用方法
2017/05/01 Javascript
React学习笔记之列表渲染示例详解
2017/08/22 Javascript
微信小程序实现天气预报功能
2018/07/18 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
2019/12/01 Javascript
JavaScript实现Tab标签页切换的最简便方式(4种)
2020/06/28 Javascript
[38:30]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场2
2014/05/24 DOTA
Python之列表的插入&amp;替换修改方法
2018/06/28 Python
python 将列表中的字符串连接成一个长路径的方法
2018/10/23 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
2019/03/27 Python
Python迭代器iterator生成器generator使用解析
2019/10/24 Python
python机器学习库xgboost的使用
2020/01/20 Python
学习python需要有编程基础吗
2020/06/02 Python
英国领先的高街书籍专家:Waterstones
2018/02/01 全球购物
维修工先进事迹
2014/05/29 职场文书
MySQL中order by的使用详情
2021/11/17 MySQL
MySQL笔记 —SQL运算符
2022/01/18 MySQL
vue如何在data中引入图片的正确路径
2022/06/05 Vue.js
Springboot集成kafka高级应用实战分享
2022/08/14 Java/Android