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常に 1 より大きくなります...values.length。の最初の値stringsは常に、最初の置換までのテンプレート文字列の内容になります。置換がテンプレート文字列の最初の値である場合strings[0]は、空の文字列です。テンプレート文字列の最後の値が置換である場合も同様strings[strings.length-1]で、空の文字列です。

したがって、あなたの例では、空の文字列をstrings[0]ととして出力しますstrings[1]が、 を出力するhelloことはありません。文字列を再結合する正しい方法は、最初のインデックスを文字列に割り当ててから、すべての値をループして順番に追加することです。strings[2]worldstrings

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 に答える