javascript - 如何从标记函数中调用原生 es6 模板字符串替换?

标签 javascript ecmascript-6 variadic-templates template-literals

我正在为模板文字编写一个 es6 标记函数,它首先检查字符串中的条件,如果未找到该条件,则仅将模板文字解释为未标记。我很好奇,从我的标记函数中,是否有一种方法可以调用浏览器的 native 模板文字函数(我认为这比我自己实现的函数更快)。 Bonue:有了这个,就没有机会进行标签组合,例如 htmlEscape(unindentfoobar);

例如。

function dumbTag(strs, ...vals) {
    vals = vals.map((val,i) =>
            (i % 2 == 0 ? 'even:' : 'odd:')+val);
    return String.template(strs, ...vals);
}

我自己实现的功能 - 有没有更快的方式/方法来调用浏览器的功能?

function template(strs, ...vals) {
    let result = strs[0];
    for (let [i,val] of vals.entries()) {
        result += val;
        result += strs[i+1];
    }
    return result;
}

最佳答案

您可以(滥用)使用 String.raw (唯一的内置标签)用于此目的:

function doNothingTag() {
  arguments[0] = { raw: arguments[0] };
  return String.raw(...arguments);
}

// Or in a more modern style:
const doNothingTag = (strings, ...rest) => String.raw({ raw: strings }, ...rest);

doNothingTag`It ${true ? 'works!' : 'fails'}`
// "It works!"

doNothingTag`Even\nwith\nescape\nsequences!`
// "Even
// with
// escape
// sequences!"

这本质上只是在欺骗 String.raw 认为转义解释的字符串是原始版本。

关于javascript - 如何从标记函数中调用原生 es6 模板字符串替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38209627/

相关文章:

c++ - 模板指针参数包

javascript - 为什么 "enter"对我的表单不起作用?

javascript - 等待数组中每个项目的 promise

javascript - react 通量 Action 并存储类依赖关系

javascript - 如何从具有多个键的json对象收集数据并将所有值推送到单个键:value array

c++ - 通过可变参数模板应用属于其他类的函数

javascript - .apply 和 .call 有什么区别

javascript - location.href 使目标在悬停在链接上时出现在状态栏中

javascript - 扩展 react 组件的问题/问题

c++ - 是否有任何理由使模板模板参数成为非可变参数?