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 相关文章推荐
犀利的js 函数集合
Jun 11 Javascript
不一样的文字闪烁 轮番闪烁
Nov 11 Javascript
jquery 表单验证之通过 class验证表单不为空
Nov 02 Javascript
Javascript中类式继承和原型式继承的实现方法和区别之处
Apr 25 Javascript
angular使用post、get向后台传参的问题实例
May 27 Javascript
Node.js dgram模块实现UDP通信示例代码
Sep 26 Javascript
如何在js代码中消灭for循环实例详解
Jul 29 Javascript
JavaScript指定断点操作实例教程
Sep 18 Javascript
解决vue跨域axios异步通信问题
Apr 17 Javascript
详解小程序云开发数据库
May 20 Javascript
js判断复选框是否选中的方法示例【基于jQuery】
Oct 10 jQuery
vue接通后端api以及部署到服务器操作
Aug 13 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/12/19 PHP
php定时计划任务的实现方法详解
2013/06/06 PHP
yii数据库的查询方法
2015/12/28 PHP
Laravel学习教程之从入口到输出过程详解
2017/08/27 PHP
5秒后跳转到另一个页面的js代码
2013/10/12 Javascript
js获取url参数代码实例分享(JS操作URL)
2013/12/13 Javascript
利用javascript如何随机生成一定位数的密码
2017/09/22 Javascript
基于JSONP原理解析(推荐)
2017/12/04 Javascript
vue.js select下拉框绑定和取值方法
2018/03/03 Javascript
JavaScript变量声明var,let.const及区别浅析
2018/04/23 Javascript
一个Vue页面的内存泄露分析详解
2018/06/25 Javascript
layer弹出层全屏及关闭方法
2018/08/17 Javascript
vue使用rem实现 移动端屏幕适配
2018/09/26 Javascript
JS拖动选择table里的单元格完整实例【基于jQuery】
2019/05/28 jQuery
如何在微信小程序中存setStorage
2019/12/13 Javascript
vue+axios全局添加请求头和参数操作
2020/07/24 Javascript
手动实现vue2.0的双向数据绑定原理详解
2021/02/06 Vue.js
python 系统调用的实例详解
2017/07/11 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
2018/08/31 Python
简单谈谈python基本数据类型
2018/09/26 Python
深入浅析python 协程与go协程的区别
2019/05/09 Python
Django shell调试models输出的SQL语句方法
2019/08/29 Python
使用CSS3实现input多选框自定义样式的方法示例
2019/07/19 HTML / CSS
亚历山大·王官网:Alexander Wang
2017/06/23 全球购物
李宁官方网店:中国运动品牌
2017/11/02 全球购物
Tostadora意大利:定制T恤
2019/04/08 全球购物
学生励志演讲稿
2014/01/06 职场文书
培训主管岗位职责
2014/02/01 职场文书
西式结婚主持词
2014/03/14 职场文书
小学生期末评语大全
2014/04/21 职场文书
生态养殖创业计划书
2014/05/06 职场文书
党员承诺践诺书
2014/05/20 职场文书
2015新学期家长寄语
2015/02/26 职场文书
大学三好学生主要事迹范文
2015/11/03 职场文书
数学复习课教学反思
2016/02/18 职场文书
学校教代会开幕词
2016/03/04 职场文书