模板字符串的底层实现,是不是类似替换的的功能?

const a = ${b} world
底层是不是类似replace的功能实现的

阅读 2.5k
2 个回答

简短回答:不是

太长不看版:规范只是定义了语言中有这种特性,并没有规定如何实现,各种JS引擎选自己的实现。

而从定义来看,简单的字符串替换并不足以实现全部的特性。
一种可能的实现是从词法解析阶段就开始了,v8源码太多,选择一个相对精简的实现来参考 quickjs

再举个简单的例子

var a = 1, b = 2
var c = `sum is ${a + b}.`

被解析为

token_template  "sum is "
token_identifier     "a"
token_plus           "+"
token_identifer      "b"
token_string         "."

到语法解析阶段, 从 token_template 开始,到 token_string 结束(没有的加一个空字符串) 构成一个插值表达式(或者说模板字符串)。

不是,个人感觉 字符串替换解决不了逻辑问题 比如 ${a+b} '+'号怎么处理
一般是经过词法分析语法分析做成一个函数在某个作用域下去执行
参考vue的编译

<div>{{a+b}}</div>

=>

export function render(_ctx, _cache, $props, $setup, $data, $options) {
  return (_openBlock(), _createElementBlock("div", null, _toDisplayString(_ctx.a+_ctx.b), 1 /* TEXT */))
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题