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 相关文章推荐
javascript 密码强弱度检测万能插件
Feb 25 Javascript
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
Apr 01 Javascript
php 中序列化和json使用介绍
Jul 08 Javascript
jquery each的几种常用的使用方法示例
Jan 21 Javascript
JavaScript中的迭代器和生成器详解
Oct 29 Javascript
浅谈js的异步执行
Oct 18 Javascript
AngularJS递归指令实现Tree View效果示例
Nov 07 Javascript
web前端vue之CSS过渡效果示例
Jan 10 Javascript
JS实现的抛物线运动效果示例
Jan 30 Javascript
解决vue单页使用keep-alive页面返回不刷新的问题
Mar 13 Javascript
微信小程序获取用户信息并保存登录状态详解
May 10 Javascript
JS如何生成动态列表
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
历史证明,懒惰才是推动科学发展技术进步的动力
2021/03/02 无线电
php 购物车完整实现代码
2014/06/05 PHP
浅谈PHP的数据库接口和技术
2016/12/09 PHP
php微信公众号开发(3)php实现简单微信文本通讯
2016/12/15 PHP
PHP7中I/O模型内核剖析详解
2019/04/14 PHP
jquery 表单取值常用代码
2009/12/22 Javascript
SinaEditor使用方法详解
2013/12/28 Javascript
JavaScript的strict模式与with关键字介绍
2014/02/08 Javascript
Node.js中创建和管理外部进程详解
2014/08/16 Javascript
JavaScript中使用自然对数ln的方法
2015/06/14 Javascript
纯JavaScript实现的分页插件实例
2015/07/14 Javascript
Angularjs 双向绑定时字符串的转换成数字类型的问题
2017/06/12 Javascript
JS验证码实现代码
2017/09/14 Javascript
微信小程序实现点击按钮修改view标签背景颜色功能示例【附demo源码下载】
2017/12/06 Javascript
JavaScript实现简单的隐藏式侧边栏功能示例
2018/08/31 Javascript
Vue CLI 3搭建vue+vuex最全分析(推荐)
2018/09/27 Javascript
微信小程序手动添加收货地址省市区联动
2020/05/18 Javascript
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
Python+tkinter模拟“记住我”自动登录实例代码
2018/01/16 Python
Python设计模式之简单工厂模式实例详解
2019/01/22 Python
将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例
2020/01/04 Python
python 写函数在一定条件下需要调用自身时的写法说明
2020/06/01 Python
python爬取音频下载的示例代码
2020/10/19 Python
appium+python自动化配置(adk、jdk、node.js)
2020/11/17 Python
Anaconda的安装与虚拟环境建立
2020/11/18 Python
CSS实现的一闪而过的图片闪光效果
2014/04/23 HTML / CSS
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
李维斯德国官方网上商店:Levi’s德国
2016/09/10 全球购物
说出你对remoting 和webservice的理解和应用
2014/06/08 面试题
搞笑婚礼主持词
2014/03/13 职场文书
安踏广告词改编版
2014/03/21 职场文书
市委召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
学习经验交流会演讲稿
2015/11/02 职场文书
《风筝》教学反思
2016/02/23 职场文书
婚礼必备主持词范本!
2019/07/23 职场文书
Java 数组的使用
2022/05/11 Java/Android