字符串-模板编译

news2024/10/5 18:30:32

模板编译

编译就是一种格式转换成另一种格式的过程,这里主要讨论一下模板编译。模板字符串对比普通的字符串有很多的不同,模板字符串可以嵌套,并且模板字符串可以在内部使用${xxx}进行表达式运算以及函数调用,这些其实都是模板编译的结果。

普通的字符串编译也就是字符拼接,如果在字符串内使用参数或者表达式,那么就需要用+号连接,例如:

let market = document.getElementById('market')
let num = 5   // 数量
let money = 4  // 金额
market.innerHTML = "总共卖出" + num + "杯柠檬水,总金额:" + num * money + "元"

在这里插入图片描述
如果用模板字符串来表达的会更加简洁,而且不需要字符串拼接,并且在内部可以直接使用表达式,例如:

market.innerHTML = `总共卖出${num}杯柠檬水,总金额:${num * money}`

普通字符串跟模板字符串得出来的结果是一样的,可以这么说,其实就是模板字符串经过了编译处理,使字符串操作更简洁,原本需要繁琐的字符串拼接,在这里直接用模板字符串就可以解决,模板字符串是怎么样编译的呢,这里就来拆解一下模板字符串的编译过程。

1、构建模板生成函数

这里就是模板字符串编译的框架,构建一个compile 函数,通过new Function 方式返回一个新函数,新函数接收一个obj对象,通过return返回最终结果。

const compile = function (template) {
            // 模板字符串
            let result = ''

            return new Function('obj', result)
        }

2、正则替换

正则不仅可以做数据校验,还可以对传入的内容进行判断,对符合条件的内容做操作,在这里,正则起了一个替换的作用。

// compile 函数
 const compile = function (template) {
       // 模板字符串
       let result = template.replace(/{{(.+?)}}/g, (match, key) => {
          return `obj.${key}`
       });
          result = `return "${result}"`;
          return new Function('obj', result);
  }

// 字符串模板
const template = "<p>Hello, I'm {{user.name}}! {{user.age}} years old!</p>"
// 调用compile传入template 
const render = compile(template)
console.log(render)

输出的结果:

 anonymous(obj) {
     return "<p>Hello, I'm obj.user.name! obj.user.age years old!</p>"
    }

这里例子就是将传入的字符串通过正则匹配,并且将它替换成表达式的形式obj.user.nameobj.user.age,虽然有了表达式,但它归根结底还是一个字符串,无法编译,我们需要把obj.user.nameobj.user.age变成动态的,并且能够编译。

3、修改正则

只需要修改一下正则即可,让字符串变成最上面提到过的,字符串拼接的形式即可。

const compile = function (template) {
   // 模板字符串
   let result = template.replace(/{{(.+?)}}/g, (match, key) => {
   // 前后加上引号
   return `" + obj.${key} + "`
    });
      result = `return "${result}"`;
      return new Function('obj', result);
    }

template.replace这里,将符合条件的位置替换,变成字符串拼接的形式。

const data = {
          user: {
             name: 'hayes',
             age: 18
             }
         }
const template = "<p>Hello, I'm {{user.name}}! {{user.age}} years old!</p>"
const render = compile(template)
const result = render(data)
console.log(result)

传入的值经过了处理,在template.replace下面的return这里实际上将字符串变成了这种形式
在这里插入图片描述
只需要将返回的结果渲染到页面即可,最终的结果:
在这里插入图片描述

完整版:

const compile = function (template) {
       // 模板字符串
       let result = template.replace(/{{(.+?)}}/g, (match, key) => {
            // 前后加上引号
            return `" + obj.${key} + "`
            // 此处就变成了 "<p>Hello, I'm " + obj.user.name + "! " + obj.user.age + " years old!</p>"
            });
            result = `return "${result}"`;
            return new Function('obj', result);
        }
        
const template = "<p>Hello, I'm {{user.name}}! {{user.age}} years old!</p>"
const render = compile(template)
const data = {
         user: {
             name: 'hayes',
             age: 18
           }
        }
const result = render(data)
console.log(result)

在这里插入图片描述


案例源码:https://gitee.com/wang_fan_w/es6-science-institute

如果觉得这篇文章对你有帮助,欢迎点亮一下star哟

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/64064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DPDK Ring

无锁环ring是DPDK提供的一种较为基础的数据结构&#xff0c;其支持多生产者和多消费者同时访问。 经过我的经验&#xff0c;无锁结构的实现主要依靠两方面&#xff1a; 最终的数据交换一定要是原子级的操作&#xff0c;最常用到的自然就是比较后交换&#xff08;Compare And S…

Java项目:SSM个人博客网站管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目包含管理员与游客两种角色&#xff1b; 管理员角色包含以下功能&#xff1a; 发表文章,查看文章,类别管理,添加类别,个人信息管理,评论…

DeepSort目标跟踪算法

DeepSort目标跟踪算法是在Sort算法基础上改进的。 首先介绍一下Sort算法 Sort算法的核心便是卡尔曼滤波与匈牙利匹配算法 卡尔曼滤波是一种通过运动特征来预测目标运动轨迹的算法 其核心为五个公式&#xff0c;包含两个过程&#xff1a; 其分为先验估计&#xff08;预测&…

[附源码]计算机毕业设计人事管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

UE4中抛体物理模拟UProjectileMovementComponent

UE4中抛体物理模拟UProjectileMovementComponent1.简述2.使用方法3.绘制抛物曲线4.绘制抛物曲线1.简述 背景&#xff1a;实现抛体运动&#xff0c;反弹效果&#xff0c;抛物曲线等功能 通用实现可以使用spline绘制&#xff0c;物体按照下图接口可以根据时间更新位置 USplineC…

CN_MAC介质访问控制子层@CSMA协议

文章目录常用方法静态方法信道划分MAC特点动态方法随机访问MACCSMA协议CSMA/CD多点接入(或多点访问):载波监听Note:&#x1f388;碰撞检测碰撞:碰撞冲突过程传播时延对载波侦听的影响&#x1f388;争用期发现碰撞的最迟情况电磁波的速率是有限最短帧长&#x1f388;小结&#x…

CAD重复圆绘制机械图形

这次CAD必练图形第四个&#xff0c;这个图形主要用到了CAD圆、直线、修剪、旋转等多个命令&#xff0c;看着不简单&#xff0c;等绘制出来后就觉得还是挺简单的。 目标图形 操作步骤 1.使用CAD直线命令绘制一条水平的直线和四条垂直的直线&#xff0c;四条垂直的直线之间的距…

【网络层】DHCP协议(应用层)、ICMP、IPv6详解

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录DHCP------DHCP服务器来动态分配IP--------应用层协议----允许地址重用ICMP字段----差错报文、询问报文差错报文-----终点不可达无法交付--------源点抑制、拥塞丢数据&#xff08;现在废弃&#xff09;----…

JAVA小区物业管理系统(源代码+论文)

毕业设计(论文) [摘要] 物业管理系统是紧随当今时代发展的需要&#xff0c;目的在于实现不同的人员对物业系统的不同的需要&#xff0c;有利于社会的稳定和顺利发展。 关键词&#xff1a;小程序Applet&#xff1b;应用程序Application;数据库&#xff1b;数据库实现&#xf…

12.5 - 每日一题 - 408

每日一句&#xff1a;没有醒不来的早晨&#xff0c;弄不懂的题目&#xff0c;熬不过的迷茫&#xff0c;只有你不敢追的梦。 数据结构 1 在最后一趟排序开始之前&#xff0c;所有记录有可能都不在其最终位置上的是______。 A. 直接插入排序B. 冒泡排序C. 堆排序D. 快速排…

底层逻辑-理解Go语言的本质

1.Java VS Go语言 Java&#xff0c;从源代码到编译成可运行的代码 上图已经展示了这个过程:从Java的源代码编译成jar包或war包(字节码),最终运行在JVM中。 我们把Java源代码编译后的jar包或war包看成是工程师生产出来的产品&#xff0c;操作系统是一个平台&#xff0c;JVM就是…

【RCNN系列】RCNN论文总结

目标检测论文总结 【RCNN系列】 RCNN RCNN目标检测论文总结前言一、Pipeline二、模型设计1.warp2.SVM3.阈值设定4.box回归三、思考四、缺点前言 一些经典论文的总结。 一、Pipeline 首先传入Input image&#xff0c;利用Selective Search&#xff08;比较古老&#xff09;算法…

【计算机网络】数据链路层:拓展的以太网

在物理层拓展以太网&#xff1a; 使用光纤拓展&#xff1a;主机使用光纤和一对光纤调制解调器连接到集线器。 使用集线器拓展&#xff1a;使用集线器连成更大的以太网 集线器优点&#xff1a; 使原来不同碰撞域的计算机能够跨碰撞域通信&#xff0c;扩大了以太网覆盖的地理范…

GDB使用技巧和相关插件

GDB使用-小技巧 参考&#xff1a;《100个gdb小技巧》 链接中的文档有许多关于GDB的使用小技巧&#xff1b; $info functions - 列出函数的名称 $s/step - 步入&#xff0c;进入带有调试信息的函数 $n/next - 下一个要执行的程序代码 $call/print - 直接调用函数执行 $i/info …

jvm简介

.什么是JVM&#xff1f; JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相…

Postman如何做接口测试,那些不得不知道的技巧

目录&#xff1a;导读 前言 Postman如何做接口测试1&#xff1a;如何导入 swagger 接口文档 Postman如何做接口测试2&#xff1a;如何切换测试环境 Postman如何做接口测试3&#xff1a;什么&#xff1f;postman 还可以做压力测试&#xff1f; Postman如何做接口测试4&…

电源控制测试老化系统-国产电源测试仪器-电源模块测试系统NSAT-8000

*测试仪器&#xff1a;可编程直流电源、可编程直流电子负载、数字示波器、功率计 *测试产品&#xff1a;电源模块。纳米软件电源ATE自动测试系统适用于大功率工业电源、AC/DC类DC电源供应器、适配器、充电器、LED电源等开关电源之综合性能测试。 *被测项目&#xff1a;有效值电…

快来组战队,赢iPhone啦!

常见问题 问&#xff1a;我邀请的人再去邀请&#xff0c;也算我的战队队员么&#xff1f;我最多可以有多少个队员&#xff1f; 答&#xff1a;您将和您直接邀请的人组成战队&#xff0c;并担任该战队的队长。如果被您邀请的小伙伴再去邀请其他人&#xff0c;那么您邀请的小伙…

跨域推荐(Cross-Domain Recommendation)的最新综述

论文解读系列第十六篇&#xff1a;IJCAI 2021--跨域推荐&#xff08;Cross-Domain Recommendation&#xff09;的最新综述 - 知乎 数据稀疏问题 目录 1.背景介绍 (1)内容层级相关性(content-level relevance) (2)用户层级相关性(user-level relevance) (3)产品层级相关性…

OpenCV从2到3的过渡

与版本2.4相比&#xff0c;OpenCV 3.0引入了许多新算法和功能。有些模块已被重写&#xff0c;有些已经重组。尽管2.4中的大多数算法仍然存在&#xff0c;但接口可能不同。本节描述了一般性的最显着变化&#xff0c;过渡操作的所有细节和示例都在本文档的下一部分中。 1、贡献存…