如何在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部分插入静态部分并返回结果(在上面的例子中没有显示)。