Javascript 变量的字符串插值

Javascript 变量的字符串插值,javascript,ecmascript-6,Javascript,Ecmascript 6,假设我有一个变量str var str = "123" 现在我可以做console.log(`Hello${str}`),它将打印Hello 123 现在我有了另一个变量strnew var strnew = 'Hello ${str}' 注意(基于答案/评论)-strnew是从文件中读取的,因此它始终是一个字符串,不能替换为` 如何打印console.log(…)打印Hello 123 有没有可能不使用任何类型的eval()就可以使用函数而不仅仅是字符串 var strnew=函数(st

假设我有一个变量
str

var str = "123"
现在我可以做
console.log(`Hello${str}`)
,它将打印
Hello 123

现在我有了另一个变量
strnew

var strnew = 'Hello ${str}'
注意(基于答案/评论)-
strnew
是从文件中读取的,因此它始终是一个字符串,不能替换为
`

如何打印
console.log(…)
打印
Hello 123


有没有可能不使用任何类型的
eval()

就可以使用函数而不仅仅是字符串

var strnew=函数(str){
返回'Hello${str}';
}
var str=“123”;

console.log(strnew(str))
简单到
${str}
您可以使用一个简单的字符串替换:

var-template=(tpl,args)=>tpl.replace(/\${(\w+)}/g,(\uv)=>args[v]);
var tpl='Hello${str}和${other}';
log(模板(tpl,{str'foo',other'bar'})多亏了,这里有一些黑魔法代码可以实现您想要的。免责声明-这是为了好玩/非常有限和异国情调的应用。它可能会非常缓慢,在很多边缘案例中会出现故障,但在您的问题范围有限的情况下,它会起作用

函数getString(){ 返回“计算${foo}+${bar}=${foo+bar}”; } var localEnvironmentProxy=新代理({}{ has(target,prop){return true;}, 获取(目标,道具){return(目标中的道具?目标:窗口)[prop];} }); 使用(localEnvironmentProxy){ var-foo=1; var-bar=2; var templastring=getString(); var fnffulltext='带有(参数[0]){return`'+templString+'`;}'; var tempalteFn=新函数(fnFullText); log(tempalteFn(localEnvironmentProxy)); //计算1+2=3 }
我为typescript解决方案构建了:

public renderTemplate(templateStr: string, args: any): string {
  templateStr = templateStr.replace(/`/g, '\\`');
  
  const keys = Object.keys(args);

  const fn = new Function(...keys, 'return `' + templateStr + '`');

  return fn(...keys.map(key => args[key]));
}

用法几乎相同。

可能相关:我认为在这种情况下最好的方法是使用函数,它接受
str
,并在内部使用此模板字符串。我认为这只是一个示例,如果您有具有多个串联的非常长的字符串-模板字符串更好。如果字符串来自文件,则最好使用
\uuu.template
或其他模板引擎。我看不到任何从字符串生成模板字符串的选项。请使用regex replace,如
strnew.replace(/\$\{(.*?\}/g,()=>window[RegExp.$1])
如果您没有使用scopesIMHO这一最佳解决方案,并且可能不是使用模板文本的方式。模板字符串是从文件读取的,它们不在OP的代码中。@georg yes,他后来加了这张便条,我写了评论。是的。根据答案,我不得不调整我的问题。谢谢@dmI非常抱歉,我编辑了你的帖子而不是建议编辑,但我回复了。新函数(“”,“返回
”+tpl+”
”);可针对新功能进行优化(“返回
”+tpl+”
”);很好的回答!!这应该是公认的答案。给我一两天时间确认。
template(myTpl,str='foo',other='bar')
此代码隐式创建了两个全局变量。传递给函数的参数从未被使用过。@Qwertiy:right-o,最近python太多;)固定的。