テンプレート文字列を利用することで、文字リテラルに変数を埋め込めますが、
変数をそのまま埋め込むのではなく、加工した上で埋め込みたいということもあるでしょう。
例えば、
let subaru = '<strong>スバルくん</strong>' let barusu = '<strong>バルス</strong>' console.log(`${subaru}素敵です。${barusu}死になさい`); // <strong>スバルくん</strong>素敵です。<strong>バルス</strong>死になさい
この時に<>
タグをエスケープして出力したい場合に、タグ付きテンプレート文字列
という機能があります!
function escapeHtml(str) { if (!str) { return ''; } str = str.replace(/</g, '<'); str = str.replace(/>/g, '>'); return str; } function e(templates, ...values) { let result = ''; templates.forEach(function(template, index) { result += template + escapeHtml(values[index]); }); return result; } let subaru = '<strong>スバルくん</strong>' let barusu = '<strong>バルス</strong>' console.log(e `${subaru}素敵です。${barusu}死になさい`); // <strong>スバルくん</strong>素敵です。<strong>バルス</strong>死になさい
escapeHtml関数はタグをエスケープしてくれる関数です。
e`${subaru}素敵です。${barusu}死になさい`
と見慣れない書き方ですが、
タグ付きテンプレートは
関数名`テンプレート文字列`
と記述します。
タグ付きテンプレートを使うためには関数は以下の条件を満たさないといけません。
- 引数として以下を受け取ること
- テンプレート文字列(分解したもの)
- 埋め込む変数(可変長数)
- 戻り値として加工済みの文字列を返すこと
この例では引数templates(テンプレート文字列)とvalues(埋め込み変数)とをforEachで交互に出力しています。
その際に、escapeHtml関数でタグをエスケープ処理しています。
forEachで交互に出力とはどういうことかというと
forEachの1周目
templates[0] → ''
values[0] → subaru = '<strong>スバルくん</strong>'
forEachの2周目
templates[1] → '素敵です。'
values[1] → barusu = '<strong>バルス</strong>'
forEachの3周目
templates[2] → '死になさい'
values[2] → ''
となっています。
これにより、テンプレート文字列に影響を与えずに変数の値だけを加工しているのです。