0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[JavaScript] たのしいタグ付きテンプレート文字列

Last updated at Posted at 2021-01-16

これはなに?

タグ付きテンプレート文字列で色々遊んでみる記事です。

タグ付きテンプレート文字列とは?

文字列と言っていますが、文字列と言うよりは、関数の呼び出しかたです。

例えば、ある関数があったとしまして

function myFunc(){}

普通はこのように呼び出しますが、

myFunc();

このように呼び出すことを、タグ付きテンプレート文字列と言います。

myFunc``

ここで使用した関数を特別にタグ関数と言います。

タグ関数に渡される引数

タグ関数に渡される引数は、文字列をパースした結果になります。

第1引数は配列です。式以外の部分文字列が入っています。
第2引数以降は可変長です。式を評価した結果になります。

実際にどのような引数が渡されるのか確認するために、このような関数を定義しました。

function myTag(strings, ...keys) {
  console.log('strings = ', strings);
  console.log('keys = ', keys);
}

呼び出してみます。

myTag`abc`;
/* 結果 :
strings = (1)["abc"]
keys = (0)[]
*/
myTag`Java${100}Script`;
/* 結果 :
strings = (2)["Java" ,"Script"]
keys = (1)[100]
*/
myTag`pl ${1 + 1} mu ${2 * 2} di ${3 / 3}`;
/* 結果 :
strings = (4)["pl " ," mu " ," di " ,""]
keys = (3)[2 ,4 ,1] 
*/

組み込み関数をタグ関数として使ってみる

こんなこともできますが、意味はないですねww

parseInt`abc`
// 結果 : NaN

parseInt`010`
// 結果 : 10

encodeURI`\n`
// 結果 : '%0A'

色々な値を返すタグ関数

タグ関数はただの関数なので、Promiseを返したり、関数を返したりもできますね。

意味なくPromise返してみたり。

function myTag(strings) {
  return new Promise((resolv) => {
    resolv(strings.join('|');
  })
}
myTag`a${0}${1}b`.then(console.log);
// 結果 : 'a||b'

関数を返してみたり。

function myTag(strings) {
  return function(d) {
    return strings.join(d);
  }
}
console.log(myTag`a${0}${1}b`('---'));
// 結果 : 'a------b'

おまけ : TypeScriptでタグ関数を定義する

引数をTemplateStringsArrayにします。

function myTag(strings: TemplateStringsArray, ...keys: Array<any>): any {
  // (snip)
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?