【问题标题】:how to get the raw version of a template string in iojs如何在 iojs 中获取模板字符串的原始版本
【发布时间】:2015-07-08 13:19:05
【问题描述】:

是否可以在 iojs 中获取模板字符串的原始版本?

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

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

编辑1: 我需要检测一个模板字符串是否取决于它的上下文 if is 只是一个可能包含 CR 和 LF 的“常量”字符串

【问题讨论】:

  • 你不能。你为什么要那个?
  • 只能使用'"
  • thefourtheye,看我的edit1
  • 是的,您可以通过标记模板字符串来获取字符串部分的原始版本,但1+1 已经被评估为2

标签: node.js v8 ecmascript-6


【解决方案1】:

是否可以在 iojs 中获取模板字符串的原始版本?

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

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

请注意,术语“模板字符串”具有误导性(因为它可能表明您可以通过某种方式获取字符串的原始值(如上所示,情况也并非如此))。正确的术语是"template literal"。

我的需要是检测一个模板字符串是否依赖于它的上下文 if is只是一个可能包含 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 还必须将静态部分与动态部分进行插值并返回结果(上例中未显示)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    相关资源
    最近更新 更多