String.raw + テンプレートストリングのダメなとこ
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
◆ \ が関わると完全に書いたままの文字取得ができない
◆ Unicode 認識してエラーになったり 最後が \ だと syntax エラーだったり
◆ Unicode 認識してエラーになったり 最後が \ だと syntax エラーだったり
書いた文字をそのまま使える便利な String.raw です
改行もエスケープ (\\) も本当にソースコードそのままです
一見便利なのですがダメなところもあります
よくある使い方で問題が起きるとしたらほとんどがファイルパスだと思います
Uncaught SyntaxError: Octal literals are not allowed in template strings.
「\01」のところを Unicode 解釈しようとしたようで不正な値とみなされエラーです
こういう書き方ができるためですね
Uncaught SyntaxError: Unterminated template literal
最後に 「\」 が来ることができません
かといって
最後が 「\」 なときは例外で別にくっつけるのが良さそうです
1 つのテンプレートストリングにしたいならこんなこともできなくはないですが読みやすさが最悪です
C# の at string (ちゃんとした呼び方じゃないと思う) はこういう問題がないから使いやすいんですけどね
@ つけた時点で書いたままの文字列になるのと違って JavaScript だと @ 的な動きと通常の文字列の 2 パターンでパースするので仕方ないのかな
String.raw 関数では 2 つの内そのままの文字列の方を返してくれるだけで 組み込み的な JavaScript で再現できない動きはしてません
var text = String.raw`\n\r\s\b\\!"#$%&abcd`
console.log(text)
console.log(text)
\n\r\s\b\\!"#$%&abcd
改行もエスケープ (\\) も本当にソースコードそのままです
一見便利なのですがダメなところもあります
よくある使い方で問題が起きるとしたらほとんどがファイルパスだと思います
その1
var file = String.raw`C:\img\01.jpg`
Uncaught SyntaxError: Octal literals are not allowed in template strings.
「\01」のところを Unicode 解釈しようとしたようで不正な値とみなされエラーです
var one = "\61"
console.log(one)
console.log(one)
1
こういう書き方ができるためですね
その2
var dir = String.raw`C:\dir\`
Uncaught SyntaxError: Unterminated template literal
最後に 「\」 が来ることができません
かといって
var dir = String.raw`C:\dir\\`
console.log(dir)
にするとconsole.log(dir)
C:\dir\\
と 「\」 が 2 つになります最後が 「\」 なときは例外で別にくっつけるのが良さそうです
var dir = String.raw`C:\dir` + "\\"
1 つのテンプレートストリングにしたいならこんなこともできなくはないですが読みやすさが最悪です
var dir = String.raw`C:\dir${"\\"}`
C# の at string (ちゃんとした呼び方じゃないと思う) はこういう問題がないから使いやすいんですけどね
@ つけた時点で書いたままの文字列になるのと違って JavaScript だと @ 的な動きと通常の文字列の 2 パターンでパースするので仕方ないのかな
String.raw 関数では 2 つの内そのままの文字列の方を返してくれるだけで 組み込み的な JavaScript で再現できない動きはしてません