如何让一个模板字符串的iojs原始版本(how to get the raw version of

2019-10-23 17:44发布

是否有可能获得iojs模板字符串的原始版本?

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

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

EDIT1:我需要的是检测模板字符串是否依赖于它,如果是上下文只是一个“常量”的字符串,可以包含CR和LF

Answer 1:

是否有可能获得iojs模板字符串的原始版本?

不它不是。 这是不可能得到文字的原始表示,就像是没有办法获得“原始”在这些情况下的文字:

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

需要注意的是,术语“模板字符串”是误导(因为它可能表明您能在某种程度上得到字符串的原始值(这也是未如上图所示)的情况下)。 正确的说法是“文字模板 ”。

我需要的是检测模板字符串是否依赖于它,如果是上下文仅仅是可能包含CR和LF一个“常量”串

似乎是一个静态分析工具的工作。 例如,你可以使用重铸来解析的源代码,并遍历所有模板文字。

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

如果为空这样的AST节点expression的财产,那么你就知道该值是恒定的。


有一种方法来确定文本模板是否在运行时“静态”或“动态”,但涉及到改变代码的行为。

您可以使用标签模板。 标签模板是获得通过文字模板的静态和动态的部分功能。

例:

function foo(template, ...expressions) {
    console.log(template, expressions);
}

foo`foo${1+1}bar` // logs (["foo", "bar"], [2]) but returns `undefined`

也就是说,如果foo被传递只有一个参数,模板文本中不包含表达式。 然而, foo也将不得不内插与所述动态部分的静态部分和返回结果(在上面的例子中未示出)。



文章来源: how to get the raw version of a template string in iojs