You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaScript中用对象键值对插值模板字符串?求替代with语句方案

JavaScript 对象属性模板字符串插值的替代方案

你提到的with语句确实不推荐使用,这里有几种更安全高效的实现方式:

1. 解构赋值(最推荐)

直接把对象的属性解构到当前作用域,再用模板字符串,逻辑清晰且无安全隐患:

const data = { age: 18, name: "John" };
const { name, age } = data;
const result = `I'm ${name}. I'm ${age} years old`;
// 输出:"I'm John. I'm 18 years old"

这种方式明确指定要使用的属性,可读性强,也不会像with那样污染作用域。

2. 正则匹配替换(模拟Python风格)

如果想和Python一样用%(key)s/%(key)d这种占位符格式,可以写一个通用的插值函数:

function interpolate(template, data) {
  // 匹配 %(key)s 或 %(key)d 格式的占位符
  return template.replace(/%\((\w+)\)[sd]/g, (_, key) => {
    // 存在对应属性就替换,否则保留原占位符
    return data[key] ?? _;
  });
}

const data = { age: 18, name: "John" };
const template = "I'm %(name)s. I'm %(age)d years old";
const result = interpolate(template, data);
// 输出:"I'm John. I'm 18 years old"

这个函数可以处理任意符合格式的模板,适配你习惯的Python风格写法。

3. 动态生成函数(适合大量属性场景)

如果模板里要用到的属性很多,不想逐个解构,可以用Function构造函数动态生成渲染函数,但注意:仅在模板完全可控(非用户输入)的场景下使用,避免XSS风险:

function renderTemplate(template, data) {
  const keys = Object.keys(data);
  return new Function(...keys, `return \`${template}\``)(...Object.values(data));
}

const data = { age: 18, name: "John" };
const template = "I'm ${name}. I'm ${age} years old";
const result = renderTemplate(template, data);
// 输出:"I'm John. I'm 18 years old"

这种方式自动把对象的所有属性作为模板字符串的变量,省去手动解构的步骤,但一定要确保模板内容安全。

内容的提问来源于stack exchange,提问作者FaniX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:37:12