0

使用 MDN 文档中关于模板文字的示例,我们可以创建自定义“标签”函数。

var a = 5;
var b = 10;

function tag(strings, ...values) {
    console.log(strings[0]);
    console.log(strings[1]);
    console.log(values[0]);
    console.log(values[1]);

    return strings[0] + ' ' + values[0] + ' ' + strings[1] + ' ' + values[1];
}

tag`Hello ${ a + b } world ${ a * b }`;

从这里开始,我们如何以与混合时输入的相同顺序构造strings消息values

上面的标签函数在交换值/字符串顺序时会无法保持顺序,例如:

tag`Hello ${ a + b } world ${ a * b }`;
// swapped to
tag`${ a + b } hello ${ a * b } world`;

文档: https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals

4

1 回答 1

2

strings.length将永远大于...values.length一。的第一个值strings将始终是模板字符串的内容,直到第一次替换。当替换是模板字符串的第一个值时,strings[0]是一个空字符串。当模板字符串的最后一个值是替换时也是如此,strings[strings.length-1]它是一个空字符串。

因此,在您的示例中,您将空字符串输出为strings[0]strings[1]变为hello,但您从未输出strings[2]for world。重新加入字符串的正确方法是将第一个索引分配给strings字符串,然后遍历所有值并将它们按顺序添加在一起。

function tag(strings, ...values) {
  var str = strings[0];
  for (i = 0; i < values.length; i++) {
    str += values[i] + strings[i+1];
  }

  return str;
}
于 2016-04-17T05:31:02.877 回答