Javascript 在标记模板中是否合并了同级替换?

Javascript 在标记模板中是否合并了同级替换?,javascript,ecmascript-6,template-literals,tagged-templates,Javascript,Ecmascript 6,Template Literals,Tagged Templates,考虑以下因素: String.raw`Test ${123}${'abc'}`; String.raw`Test ${123 + 'abc'}`; ${123}${'abc'}是否等同于${123+'abc'}?换句话说,cibling是否在幕后转换为${123+'abc'}格式 另外,在自己的标记模板函数中如何处理这种特定情况?对于String.raw,行为基本相同。它和+(带有字符串值)都执行串联,从而获得相同的结果 它们之间的区别在于,第1行延迟了String.raw要执行的串联,并将

考虑以下因素:

String.raw`Test ${123}${'abc'}`;
String.raw`Test ${123 + 'abc'}`;
${123}${'abc'}
是否等同于
${123+'abc'}
?换句话说,cibling是否在幕后转换为
${123+'abc'}
格式


另外,在自己的标记模板函数中如何处理这种特定情况?

对于
String.raw
,行为基本相同。它和
+
(带有字符串值)都执行串联,从而获得相同的结果


它们之间的区别在于,第1行延迟了
String.raw
要执行的串联,并将
${123}
${abc'}
作为单独的参数提供给它

在使用
+
时,串联总是预先执行的,只将单个值传递给
${123+'abc'}
String.raw

function foo(template, ...values) {
  console.log(template, values);
}

foo`Test ${123}${'abc'}`; // [ 'Test ', '', '' ] [ 123, 'abc' ]
foo`Test ${123 + 'abc'}`; // [ 'Test ', '' ]     [ '123abc' ]
对于其他带标记的函数,差异可能更明显,因为该函数可能在串联之前(或之外)执行其他操作

一个人为的例子:

// adds 99999 to each value
function bar(template, ...values) {
  var raw = template.raw;
  var result = raw[0];

  values.forEach((value, i) => {
     result += value + 99999;
     result += raw[i + 1];
  });

  return result;
}

console.log(bar`Test ${123}${'abc'}`); // 100122abc9999
console.log(bar`Test ${123 + 'abc'}`); // 123abc99999

否,它们作为两个单独的参数传递给模板标记,它们之间有一个空字符串。根据标记的不同,结果可能与课程相同使用
+
也将处理
.valueOf()
中的值,而模板替换方法使用
.toString()
。在这种情况下没有区别,但在一般情况下非常重要。