Firefox 34(Nightly)で String.raw が実装された件とTaggedTemplateについて
TemplateLiteral の続き。
前回は、`
(バッククォート) でくくることで、ヒアドキュメント的な複数行に渡る文字列の生成ができる事、${expression}
で式の埋め込みができる事を書いた。
実は、func`...`
という構文の追加もあり、funcを文字列の素となる値を引数に呼び出す機能もある。String.raw
はそのためのメソッドだ。func`...`
みたいなコードはTaggedTemplateと呼ばれている。
String.raw`Title: ${document.title}` // => "Title: hogehoge@teramako" // === `Titlte: ${document.title}`
String.raw は、TaggedTemplateの超基本的な実装であり、ただのTemplateと同じである。
TaggedTemplateの関数に渡る引数
func`a\`${"B"}c${"D"}\``
と書いた時、func に渡される引数は以下のようになる。
- 各文字列部分の配列
["a`", "c", "`"]
- この配列には、
raw
プロパティが追加されていて、["a\`", "c", "\`"]
が入っている
${"B"}
の式を実行した結果- "B"
${"C"}
の式を実行した結果- "C"
第一引数の配列の間に後続の引数たちが埋まっていく感じだ。
何が楽しいの?
JSで書かれたRuby実装があれば、以下のように書けるかもしれない。
ruby` for num in 1..100 do if num % 15 == 0 puts "FizzBuzz" elsif num % 5 == 0 puts "Buzz" elseif num % 3 == 0 puts "Fizz" else puts num end end `
HTML生成が楽になるかもしれない
HTMLElement.prototype.appendHTML = function (...args) { this.insertAdjacentHTML("BeforeEnd", String.raw(...args)); } document.body.appendHTML` <p> Hello, <b>${User.name}</b>. </p>`
という感じで、個人的には面白い機能だと思ってる。あまり注目されてない気がするけど…
あ、そうそう、入力文字列をevalしたいけど、セキュリティ上関数コールはさせないみたいなフィルタリングをしている場合、func()
以外にもfunc``
もフィルタリングしないと思われるので気をつけてね。