模板文字与标签一起使用时,似乎会被编译成包含字符串和替换的数组。
例如:
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
具有评估函数的逻辑。
答案 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)
检查出来:
const mytag = (...args) => args;
console.log(mytag`my name is ${'Jason'}`);
&#13;