是否可以在iojs中获取模板字符串的原始版本?
var s = `foo${1+1}bar`
console.log(s); // foo2bar
在上一个示例中,我想获取字符串:foo${1+1}bar
EDIT1 : 我需要检测一个模板字符串是否依赖于它的上下文if if只是一个可以包含CR和LF的'常量'字符串
答案 0 :(得分:5)
是否可以在iojs中获取模板字符串的原始版本?
不,不是。它不可能获得文字的原始表示,就像没有办法获得" raw"在这些情况下的字面意思:
var foo = {[1+1]: 42};
var bar = 1e10;
var baz = "\"42\"";
注意术语"模板字符串"是误导性的(因为它可能表明你可以以某种方式得到字符串的原始值(这也不是如上所示的情况))。正确的术语是"template literal"。
我需要检测一个模板字符串是否依赖于它的上下文if is is is a a' constant'可能包含CR和LF的字符串
似乎是静态分析工具的工作。例如。您可以使用recast来解析源代码并遍历所有模板文字。
例如,the AST representation of `foo${1+1}bar`
is:
如果这样的AST节点为空expression
属性,那么您就知道该值是常量。
有一种方法可以确定模板文字是否是"静态"或"动态"在运行时,但这涉及到改变代码的行为。
您可以使用标记的模板。标记模板是传递模板文字的静态和动态部分的函数。
示例:
function foo(template, ...expressions) {
console.log(template, expressions);
}
foo`foo${1+1}bar` // logs (["foo", "bar"], [2]) but returns `undefined`
即。如果foo
仅传递一个参数,则模板文字不包含表达式。但是,foo
还必须使用动态部分插入静态部分并返回结果(上例中未显示)。