模板字符串原理,原生js实现字符串模板
在使用模板字符串的时候使用的是 '{{}}'形式进行书写,本文则向各位解密这么写的原因
初体验正则
首先要先明白正则表达式中exec的使用
例如:
let str = 'axu1997@qq.com'
let reg = /\w*[@]\w*\.\w*/
console.log(reg.exec(str)) //会得到一个数组第0项是"axu1997@qq.com"
接下来给他加个括号,将"qq"对应的部分给提取出来(在\w中加)
let str = 'axu1997@qq.com'
let reg = /\w*[@](\w*)\.\w*/
console.log(reg.exec(str)) //会得到一个数组第0项是"axu1997@qq.com",第一项是'qq'
console.log(reg.exec(str[1])) //'qq'
小试牛刀
也就是说,当你给你的正则加上括号进行匹配时可以为返回的值添加更多的项,明白了这个之后看下面的代码,注意看注释部分的结果
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
</body>
<script type="text/template" id="demotem">
<h1>{{name}}</h1>
</script>
<script type="text/javascript">
let tem = document.querySelector('#demotem').innerHTML
let reg = /{{(\w*)}}/
console.log(reg.exec(tem)); //打印出一个数组,第一项为{{name}} 第二项为name
</script>
</html>
步入正轨
接着我们再对其进行一个改造
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<div id="demoBox"></div>
</head>
<body>
</body>
<script type="text/template" id="demotem">
<h1>{{name}}</h1>
</script>
<script type="text/javascript">
let tem = document.querySelector('#demotem').innerHTML
let reg = /{{(\w*)}}/
let user = {
name:'Monday'
}
let arr = reg.exec(tem)
let tem = tem.replace(arr[0],user[arr[1]]) //也就是将'{{name}}' 替换为 user[name]中的值
document.getElementById('demoBox').innerHTML = tem//直接将结果输在界面上
</script>
</html>
通过上面的代码我们可以看到字符串模板被替换为了我们想要的值,但只能匹配一次且并不完整 SO完善一下
完善一下
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<div id="demoBox"></div>
</head>
<body>
</body>
<script type="text/template" id="demotem">
<h1>{{name}}</h1>
<p>{{age}}</p> //加多一行
</script>
<script type="text/javascript">
let tem = document.querySelector('#demotem').innerHTML
let reg = /{{(\w*)}}/
let user = {
name:'Monday',
age:24 //加多一个属性
}
let arr = []
while(arr = reg.exec(tem)){ //这里解释下,将值赋给arr当arr存在,循环继续
let tem = tem.replace(arr[0],user[arr[1]]) //将界面中所有符合这个规则的元素都替换
}
document.getElementById('demoBox').innerHTML = tem //直接将结果输在界面上
</script>
</html>
最后最后,封装一下
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<div id="demoBox"></div>
</head>
<body>
</body>
<script type="text/template" id="demotem">
<h1>{{name}}</h1>
<p>{{age}}</p>
</script>
<script type="text/javascript">
let user = {
name:'Monday',
age:"18"
}
//我们平常用字符串写的就是这样了吧
let html = template('demotem',user)
document.getElementById('demoBox').innerHTML = html
//下面是封装的代码
function template(id,obj){
let tem = document.getElementById(id).innerHTML
let reg = /{{(\w*)}}/
let arr = []
while( arr = reg.exec(tem) ){
tem = tem.replace(arr[0],obj[arr[1]])
}
return tem
}
</script>
</html>
模板字符串原理,原生js实现字符串模板的更多相关文章
- 使用原生JS进行字符串转对象
字符串转对象 目的 工作中如果需要原生 JS 完成字符转对象的话可以通过 JSON.parse(str), 但是这个方法是ES5中才出现, 如果需要兼容低版本就需要其它方法 使用原生 JS 解决字符串 ...
- 原生JS实现字符串分割
window.onload = function(){ var str = 'abc,dbc,qqq,aaa'; var sp = split(str,',')//与字符串的分隔符要一直. alert ...
- 原生js反转字符串
//直接操作 var str='nama';var rts=str.split('').reverse().join(''); //String上拓展方法String.prototype.revers ...
- 如何用原生js替换字符串中的某个字符(或字符串)为指定的字符串?
<html> <head><title>我的第一个 HTML 页面</title></head><script type=" ...
- js 小工具-- 原生 js 去除空格
// 原生js 去除字符串空格 <script type="text/javascript"> String.prototype.trim = function (){ ...
- [Vue源码]一起来学Vue模板编译原理(二)-AST生成Render字符串
本文我们一起通过学习Vue模板编译原理(二)-AST生成Render字符串来分析Vue源码.预计接下来会围绕Vue源码来整理一些文章,如下. 一起来学Vue双向绑定原理-数据劫持和发布订阅 一起来学V ...
- 前后端数据交互处理基于原生JS模板引擎开发
json数据错误处理,把json文件数据复制到----> https://www.bejson.com/ 在线解析json 这样能直观的了解到是否是json数据写错,在控制台打断点,那里错误打那 ...
- c#字符串加载wpf控件模板代码 - 简书
原文:c#字符串加载wpf控件模板代码 - 简书 ResourceManager resManagerA = new ResourceManager("cn.qssq666.Properti ...
- 【字符串】【P5830】 【模板】失配树
[字符串][P5830] [模板]失配树 Description 给定一个长度为 \(n\) 的字符串 \(S\),有 \(m\) 次询问,每次询问给定 \(S\) 的两个前缀,求它们的最长公共 bo ...
随机推荐
- 7-31 jmu-分段函数l (20 分)
本题目要求计算以下分段函数的值(x为从键盘输入的一个任意实数): 如果输入非数字,则输出“Input Error!” 输入格式: 在一行中输入一个实数x. 输出格式: 在一行中按”y=result”的 ...
- Spring 事务传播机制和数据库的事务隔离级别
Propagation(事务传播属性) 类别 传播类型 说明 支持当前事务 REQUIRED 如果当前没有事务,就新建一个事务.@Transaction的默认选择 支持当前事务 SUPPORTS 就以 ...
- Kali虚拟机的扩容经历
Kali虚拟机的扩容经历 0x01 起因 更新了一下软件包,竟然提示我空间不足. 升级了 687 个软件包,新安装了 82 个软件包,要卸载 0 个软件包,有 8 个软件包未被升级. 需要下载 1,5 ...
- 使用node打造自己的命令行
一.实现一个简单的功能 二.环境 1.系统: window 10 2.编辑器: vscode 3.node版本: 8.7.0 三.开始玩 1.打开命令行,新建一个pa'ckage.json npm i ...
- JZOJ 1776. 经济编码 (Standard IO)
1776. 经济编码 (Standard IO) Time Limits: 1000 ms Memory Limits: 128000 KB Description 为降低资料储存的空间或增加资料传送 ...
- Ubuntu中VMware tools的安装步骤
按照下面的步骤,轻松解决!! 1.点击导航栏中的虚拟机,下面的安装VMware tools 2.点击桌面上的光盘,进入后,将tar.gz文件复制到桌面,然后右击提取到此处: 3.在桌面打开终端,cd到 ...
- Node的require和module.exports
node编程中最重要的思想之一就是模块,在 Node.js 模块系统中,每个文件都被视为独立的模块.这是这个思想,让javascript的大规模工程成为可能.模块化编程在前端大肆盛行,在node中导出 ...
- pikachu——暴力破解
前述: 前面学习了sqli-labs 和 DVWA,也算是初步涉足了web漏洞,了解了一些web漏洞的知识.所以在pikachu上面,会更加仔细认真,把前面没有介绍到的知识点和我一边学习到的新知识再补 ...
- ggplot2(4) 用图层构建图像
4.1 简介 qplot()的局限性在于它只能使用一个数据集和一组图形属性映射,解决这个问题的办法就是使用图层.每个图层可以有自己的数据集和图形属性映射,附加的数据元素可通过图层添加到图形中. 一个图 ...
- 自动控制理论的MATLAB仿真实例(一)
拉普拉斯变换及其反变换 Laplace变换及其反变换的定义为: