ECMAScript 6中是否可预定义模板字面量并多次重复使用?
ES6 模板复用功能实现说明
ES6 原生没有提供和 C# string.Format 完全一致的、直接存储带占位符的静态模板、后续传参生成字符串的开箱即用API,但实现这个需求没有任何门槛,是开发中非常常见的基础操作。
首先要明确一个基础特性:ES6 原生模板字面量是定义时立即求值的,如果你直接写 let template = \Hello ${target}`,这行代码执行时就会读取当前作用域的target`值、直接拼接成最终字符串存在变量里,不会保留占位符等后续传参,所以没法直接按示例里的写法直接用。
实际开发中实现模板复用主要有两种主流方案:
方案一:函数包装模板(最推荐,原生无额外开销)
把模板写在接收参数的函数里,每次调用函数传入不同参数,就会重新执行模板求值生成新字符串,不需要任何额外工具代码,性能最好、灵活度最高:// 定义可复用模板 const greetingTemplate = (target) => `Hello ${target}`; // 多次传参复用 const str1 = greetingTemplate("World"); // 输出 "Hello World" const str2 = greetingTemplate("There"); // 输出 "Hello There" const str3 = greetingTemplate("There Again"); // 输出 "Hello There Again"这种写法支持在模板里写任意JS表达式、条件判断、嵌套模板,是目前前端生态里最通用的模板复用实践。
方案二:自定义Format工具函数(对齐C#使用习惯)
如果你就是想要和C#string.Format完全一致的调用体验,先存带占位符的纯字符串模板,后续传参替换,只需要几行代码实现一个轻量格式化函数即可:- 索引占位符版本(和C# {0}/{1} 占位符逻辑完全对齐)
function Format(template, ...args) { return template.replace(/\{(\d+)\}/g, (match, index) => { // 对应位置无参数时保留原占位符,避免输出undefined return args[index] ?? match; }); } // 用法和C#完全一致 const template = `Hello {0}`; const str1 = Format(template, "World"); // "Hello World" const str2 = Format(template, "There"); // "Hello There" const str3 = Format(template, "There Again"); // "Hello There Again"- 命名占位符版本(更易读,适合多参数模板)
function Format(template, params) { return template.replace(/\{(\w+)\}/g, (match, key) => { return params[key] ?? match; }); } // 用法 const template = `Hello {target}`; const str1 = Format(template, { target: "World" }); // "Hello World"
补充:截止到最新的ECMAScript标准,依然没有内置通用的字符串格式化方法,但上述两种方案已经能覆盖所有模板复用场景,绝大多数项目要么直接用函数包装模板,要么引入上述几行代码的轻量工具函数即可,不需要依赖第三方模板库。
内容的提问来源于stack exchange,提问作者zwcloud
相关产品推荐
相关产品推荐

