2

考虑以下几点:

String.raw`Test ${123}${'abc'}`;
String.raw`Test ${123 + 'abc'}`;

${123}${'abc'}相当于${123 + 'abc'}?_ 换句话说,是否将 ciblings 转换为${123 + 'abc'}幕后的格式?

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

4

1 回答 1

1

String.raw,行为本质上是相同的。它和+(带有字符串值)都执行连接,达到相同的结果。


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

在 using 中+,总是预先执行连接,只将单个值传递给String.rawfor ${123 + 'abc'}

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
于 2015-10-18T18:07:21.407 回答