回答編集履歴

1

コメントを受けて追記

2019/09/17 12:37

投稿

thyda.eiqau
thyda.eiqau

スコア2982

test CHANGED
@@ -45,3 +45,63 @@
45
45
 
46
46
 
47
47
  `<div id="\hoge"></div>` の `\hoge` がエスケープされない理由ですが、HTMLには「`\`は次の文字を特殊にする文字である」というようなルールがないからです。
48
+
49
+
50
+
51
+ ----
52
+
53
+ コメントを受けて追記 Sep 17, 2019 9:37 pm
54
+
55
+ > 「"\hoge"という文字列をJSで取得すると"\hoge"と解釈されるようになる」という理解でよろしいでしょうか?
56
+
57
+
58
+
59
+ これは衝撃の事実なのですが、「文字列」と「文字列リテラル」は別物です。私の回答は意図的に、文字列はカギカッコ、文字列リテラルはダブルクォートで囲って示しています。
60
+
61
+ 「\hoge」という文字列を取得する方法はいくらでもあります。下記の例はいずれも「\hoge」という文字列を取得してコンソールに表示するコードです。
62
+
63
+ ```html
64
+
65
+ <div id="piyo" data-fuga="\hoge"></div>
66
+
67
+ <script>
68
+
69
+
70
+
71
+ // 例1
72
+
73
+ const ex1 = document.getElementById('piyo').dataset.fuga;
74
+
75
+ console.log(ex1);
76
+
77
+
78
+
79
+ // 例2
80
+
81
+ const ex2 = [92, 104, 111, 103, 101].map(c => String.fromCharCode(c)).join('');
82
+
83
+ console.log(ex2);
84
+
85
+
86
+
87
+ // 例3
88
+
89
+ const ex3 = '\hoge';
90
+
91
+ console.log(ex3);
92
+
93
+
94
+
95
+ </script>
96
+
97
+ ```
98
+
99
+ 例1は、疑問と提示されたのと同様ですね。IDに入れるのは不適とのyoorwmさんのアドバイスを受けて、datasetに変えています。yoorwmさん、ありがとうございます。
100
+
101
+ 例2は、文字コードから文字列を生成する `String.fromCharCode()` メソッドを使って、結果を連結しています。
102
+
103
+ 例3は、文字列リテラルから文字列を生成しています。
104
+
105
+
106
+
107
+ 「文字列リテラル」は文字列を生成するための記法であって文字列そのものではありません。例1と例2はそれぞれの結果として文字列を生成しているのであって、文字列リテラル `"\hoge"` に変換されているわけではありません。