如何在iojs中获取模板string的原始版本

是否有可能在iojs中获得模板string的原始版本?

var s = `foo${1+1}bar` console.log(s); // foo2bar 

在前面的例子中,我想获得string: foo${1+1}bar

编辑1 :我的需要是检测一个模板string是否依赖于它的上下文如果是只是一个“常量”string,可能包含CR和LF

是否有可能在iojs中获得模板string的原始版本?

不它不是。 就像在这种情况下无法获得“原始”文字一样,不可能获得文字的原始表示。

 var foo = {[1+1]: 42}; var bar = 1e10; var baz = "\"42\""; 

请注意,术语“模板string”是误导性的(因为它可能表明,你可以以某种方式获得string的原始值(这也不是如上所示))。 正确的术语是“模板文字 ”。

我的需要是检测一个模板string是否依赖于它的上下文if is只是一个可能包含CR和LF的“常量”string

看起来像一个静态分析工具的工作。 比如你可以使用recast来parsing源代码并遍历所有的模板文字。

例如, `foo${1+1}bar`的AST表示是 :

在这里输入图像描述

如果这样一个AST节点作为一个空的expression属性,那么你知道这个值是不变的。


有一种方法可以确定模板文字在运行时是“静态”还是“dynamic”,但涉及到更改代码的行为。

您可以使用标记的模板。 标记模板是通过模板文字的静态和dynamic部分的函数。

例:

 function foo(template, ...expressions) { console.log(template, expressions); } foo`foo${1+1}bar` // logs (["foo", "bar"], [2]) but returns `undefined` 

也就是说,如果foo只传递一个参数,模板文字不包含expression式。 但是, foo也必须用dynamic部分插入静态部分并返回结果(在上面的例子中没有显示)。