模板文字:如何正确执行替换?

Template literals: how to perform substitution correctly?

所以我有一个标签功能:

var tagFunc = function(strings, ...expressions){

}

如果我调用它:

tagFunc`sum is ${2+2}`

那么我假设:

我的假设是否正确?如何正确生成 tagFunc 中的最终字符串?

我的尝试是

var tagFunc = function(strings, ...expressions){
    var str = "";
  strings.forEach((string, i) => {
       str += string + (expressions[i]?expressions[i]:"");
  });
    return str;
}
console.log(tagFunc`sum is ${2+2}` === `sum is ${2+2}`) // true

这似乎有效:

我可以依靠我的假设并继续这个逻辑吗?

假设正确,这就是标签的工作原理,另请参阅 the reference

代码中有错误,这将忽略错误的表达式:

  strings.forEach((string, i) => {
       str += string + (expressions[i]?expressions[i]:"");
  });

由于预期总是有最终字符串并且 stringsexpressions 多 1 个元素,因此可以是:

const tagFunc = ([initialString, ...strings], ...expressions) => expressions.reduce(
  (str, expression, i) => str + String(expression) + strings[i],
  initialString
);

最好有 String() 因为 .