【问题标题】:Are sibling substitutions combined in tagged templates?标记模板中是否组合了兄弟替换?
【发布时间】:2015-10-19 02:34:14
【问题描述】:

考虑以下几点:

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

${123}${'abc'} 是否等同于 ${123 + 'abc'}?换句话说,ciblings 是否在后台转换为${123 + 'abc'} 格式?

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

【问题讨论】:

  • 不,它们作为两个单独的参数传递给模板标签,它们之间有一个空字符串。根据标签,结果当然可能是相同的

标签: javascript ecmascript-6 template-literals tagged-templates


【解决方案1】:

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


它们之间的区别在于,第一行推迟了 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()。在这种情况下没有什么不同,但在一般情况下非常重要。
猜你喜欢
  • 2015-08-26
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
  • 2013-06-17
  • 1970-01-01
  • 2020-08-05
相关资源
最近更新 更多