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;
}

最佳答案

您可以(ab)使用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/41542685/

相关文章:

javascript - 使用 node.js 和 ES6/ES7 功能逐行读取 CSV 文件

javascript - 异步 js 验证表单

c++ - 可变参数模板结构,递归类型声明,可能吗?

c++ - 如何在 C++11 中构建具有在编译时递增值的整数成员的结构序列

c++ - 事件发射器和成员方法自动注册为监听器

javascript - 无法从 express.js 加载静态文件

javascript - 引用单个表的多列 - Sails JS API 模型

javascript - async.waterfall 不会在最后呈现

javascript - 如何将函数移出循环

javascript - Babel 如何知道将模块视为模块