ES6模板文字到“反编译”的数组表示

时间:2018-02-14 23:52:29

标签: javascript ecmascript-6

模板文字与标签一起使用时,似乎会被编译成包含字符串和替换的数组。

例如:

mytag `my name is ${'Anthony'}`

似乎被编译成代表:

的东西
mytag.apply(null, [['my name is '], 'Anthony'])

我的问题是,我怎样才能`my name is ${'Anthony'}`并获得[['my name is '], 'Anthony']“反编译”代表?

我已经包含了一个片段来证明上述情况属实。

function mytag(a, ...b) {
  for (let i = 0; i < a.length; i++) {
    console.log(a[i]);
    console.log(b[i]);
  }
}

mytag`hello ${'world'}, how are ${'you'}`;

mytag.apply(null, [['hello', ', how are ', ''], 'world', 'you']);

修改

只是为了澄清我的总体目标。

我希望能够将模板文字传递给标记。

这是一个稍微复杂的例子,

const myliteral = `my  name is ${() => 'Anthony'}`;
// would "decompile" to [['my name is'], f]

mytag.apply(null, fnToGetDecompiledRep(myliteral));

我在myliteral中使用了一个函数来证明函数没有得到评估。您可以假设mytag具有评估函数的逻辑。

2 个答案:

答案 0 :(得分:3)

你可以做

function templateValues(...args) {
    return args;
}

并将其命名为

console.log(templateValues `my name is ${'Anthony'}`)
console.log(templateValues `hello ${'world'}, how are ${'you'}`;
  

我想在不使用标签的情况下获得数组表示

const myliteral = `my  name is ${() => 'Anthony'}`;
// would "decompile" to [['my name is'], f]
mytag.apply(null, fnToGetDecompiledRep(myliteral));

不,那不行。将为myLiteral分配文字表达式在此处创建的字符串值。你不能反编译&#34;事后呢。你需要使用

const myParts = templateValues `my  name is ${() => 'Anthony'}`;
// same as  … = [['my name is'], () => 'Anthony'];
myTag.apply(null, myParts); // or myTag(...myParts)

标记无法获取模板值而不是字符串。

答案 1 :(得分:1)

检查出来:

&#13;
&#13;
const mytag = (...args) => args;
console.log(mytag`my name is ${'Jason'}`);
&#13;
&#13;
&#13;