Javascript 使用函数构建ES6模板文本

Javascript 使用函数构建ES6模板文本,javascript,regex,Javascript,Regex,我有一个包含模板文本变量的字符串,但由于它是动态构建的,所以不是模板文本。我想将其转换为模板文字,而不进行求值: 我正在寻找以RegExp类的精神访问内部模板生成器的方法,它可以用来代替标准的RegExp文本斜杠//: 因此,我可以这样做: const myStr = 'I want to be ${foo}'; const foo = 99; const lit = new TemplateLiteral(myStr); console.log( lit.run() )

我有一个包含模板文本变量的字符串,但由于它是动态构建的,所以不是模板文本。我想将其转换为模板文字,而不进行求值:

我正在寻找以RegExp类的精神访问内部模板生成器的方法,它可以用来代替标准的RegExp文本斜杠//:

因此,我可以这样做:

   const myStr = 'I want to be ${foo}';
   const foo = 99;
   const lit = new TemplateLiteral(myStr);
   console.log( lit.run() ); // I want to be 99

你不能建立一个文字。这在术语上是矛盾的。在源代码语法中,to是编译的文本值

新RegExp。。。生成新的regexp对象,但不是regexp文本。RegExp literal是指您实际写入/../

同样,字符串文字仅在您写入“…”时才是字面意义上的。。。或者代码中的“…”。您可以构建一个字符串(通常使用连接),但无法构建字符串文本

编辑:快速和肮脏:

函数makeTemplatetemplate{ 返回新函数return`+template+`; } const myStr='我想成为${foo}'; 常数foo=99; const template=makeTemplatemyStr; console.logtemplate;
//我想成为99你不能建立文字。这在术语上是矛盾的。文本是源代码中编译为值的语法

新RegExp。。。生成新的regexp对象,但不是regexp文本。RegExp literal是指您实际写入/../

同样,字符串文字仅在您写入“…”时才是字面意义上的。。。或者代码中的“…”。您可以构建一个字符串(通常使用连接),但无法构建字符串文本

编辑:快速和肮脏:

函数makeTemplatetemplate{ 返回新函数return`+template+`; } const myStr='我想成为${foo}'; 常数foo=99; const template=makeTemplatemyStr; console.logtemplate;
//我想成为99这里的关键问题是您在第一个代码块中的注释:

这是由algo动态创建的

如果模板是由算法创建的,则您可以选择:

不要使用内置模板功能,请使用任何类似的模板库或编写自己的模板库 使用eval或它的一个同类新函数可能是最好的 无法动态创建模板文本。它们是文字-

如果我们对您的算法了解得更多,我们可能会更好地帮助您。例如,您可以让算法创建一个函数,然后使用它可能需要的信息调用该函数:

function getVarsFormatter(var1First) {
    if (var1First) {
        return (var1, var2) => `${var1} ${var2}`;
    } else {
        return (var1, var2) => `${var2} ${var1}`;
    }
}
然后

实例:

函数getVarsFormattervar1First{ 如果var1First{ 返回var1,var2=>`${var1}${var2}`; }否则{ 返回var1,var2=>`${var2}${var1}`; } } 对于设n=0;n<6++n{ const formatter=getvarsformatermath.random<0.5; const result=formatter这是var1,这是var2; console.logresult;
} 这里的关键问题是您在第一个代码块中的注释:

这是由algo动态创建的

如果模板是由算法创建的,则您可以选择:

不要使用内置模板功能,请使用任何类似的模板库或编写自己的模板库 使用eval或它的一个同类新函数可能是最好的 无法动态创建模板文本。它们是文字-

如果我们对您的算法了解得更多,我们可能会更好地帮助您。例如,您可以让算法创建一个函数,然后使用它可能需要的信息调用该函数:

function getVarsFormatter(var1First) {
    if (var1First) {
        return (var1, var2) => `${var1} ${var2}`;
    } else {
        return (var1, var2) => `${var2} ${var1}`;
    }
}
然后

实例:

函数getVarsFormattervar1First{ 如果var1First{ 返回var1,var2=>`${var1}${var2}`; }否则{ 返回var1,var2=>`${var2}${var1}`; } } 对于设n=0;n<6++n{ const formatter=getvarsformatermath.random<0.5; const result=formatter这是var1,这是var2; console.logresult;
}一种方法是使用标记器,如果我们对模板的动态创建有更多的了解,它将有助于更好地回答这个问题。如果您熟悉老式sprintf或它的任何现代后代,然后可能对你更有效。一种方法是使用标记器,如果我们对模板的动态创建有更多的了解,它将有助于更好地回答这个问题。如果你熟悉老式sprintf或它的任何现代后代,那么可能对你更有效。你是对的,我要求的是一个模板对象,而不是文字,就像RegExp对象一样。构建模板对象后,我将调用run。为了清楚起见,我将对问题进行编辑。模板字符串文字的计算结果为字符串,而不是模板。JavaScript中没有模板对象,除了Mustache.js或Pod.js之类的库创建的模板对象。@ojosilva-JavaScript没有模板对象。它有很多功能。计算未标记的模板文字的结果是字符串。计算标记的模板文字的结果是标记函数定义的任何内容。@T.J.Crowder Inde
ed.我很少看到带标签的模板文字,我的大脑通常会跳过它们:你说得对,我要求的是一个模板对象,而不是文字,就像RegExp对象一样。构建模板对象后,我将调用run。为了清楚起见,我将对问题进行编辑。模板字符串文字的计算结果为字符串,而不是模板。JavaScript中没有模板对象,除了Mustache.js或Pod.js之类的库创建的模板对象。@ojosilva-JavaScript没有模板对象。它有很多功能。计算未标记的模板文字的结果是字符串。计算标记的模板文字的结果是标记函数定义的任何内容。@T.J.Crowder。我很少看到带标签的模板文字,我的大脑通常会跳过它们算法正在从应用程序内部的文件加载模板字符串。@ojosilva-Ugh。恐怕如果起点是定义模板的字符串(例如,从文件加载),您只能选择上面列出的两个选项:使用模板库,或使用eval的同类新函数。@ojosilva-您说的是应用程序内部的文件。它可能是一个JavaScript文件,提供类似上面getVarsFormatter返回的函数吗?算法正在从应用程序内部的文件加载模板字符串。@ojosilva-Ugh。恐怕如果起点是定义模板的字符串(例如,从文件加载),您只能选择上面列出的两个选项:使用模板库,或使用eval的同类新函数。@ojosilva-您说的是应用程序内部的文件。它可能是一个JavaScript文件,提供类似于getVarsFormatter返回的函数吗?
function getVarsFormatter(var1First) {
    if (var1First) {
        return (var1, var2) => `${var1} ${var2}`;
    } else {
        return (var1, var2) => `${var2} ${var1}`;
    }
}
const formatter = getVarsFormatter(flag);
const result = formatter("this is var1", "this is var2");