asciidwango / js-primer

:book: JavaScript Primer - 迷わないための入門書
https://jsprimer.net
Creative Commons Attribution 4.0 International
2.34k stars 224 forks source link

無効なエスケープシーケンスについてどこかに書けないか #372

Closed yumetodo closed 5 years ago

yumetodo commented 6 years ago
console.log("\d".length)
// 1
console.log("\d" === "d")
// true
console.log("\\d".length)
// 2
console.log("\\d".codePointAt(0))
// 92, the code point for the backshlash
console.log("\\d".codePointAt(1))
// 100, the code point for the lower case "d".

のように無効なエスケープシーケンスは単にバックスラッシュがなかったように扱われる。

これはべつにC++でも

#include <iostream>
int main()
{
    std::cout << "\d" << std::endl;// => d
}

https://wandbox.org/permlink/Qevm2lLrlhJNqxTA

同じ挙動なのですが、

GCC

warning: unknown escape sequence: '\d'

Clang

warning: unknown escape sequence '\d' [-Wunknown-escape-sequence]

のようにコンパイラが怒ってくれる一方、JavaScriptではそういうことはない(もしかして知らないだけでESLintでもできる?)

なのでどこかでこの件について取り上げることはできないでしょうか?


提案の背景: https://github.com/MithrilJS/mithril.js/issues/2089

azu commented 6 years ago

ESLintでもできる?

ESLintだと以下のルールが恐らくそれだと思います。 https://eslint.org/docs/rules/no-useless-escape

Demo: ESLint demo

azu commented 6 years ago

文字列と正規表現リテラルで無意味なエスケープは異なるので扱いが難しいですが、 文字列の章は後で整理するつもりです。そこで検討してみます。 無効なエスケープシーケンスについてというよりは、エスケープシーケンス自体についてですかね。

恐らくエスケープシーケンスで問題となる場合の殆どは文字列と正規表現の相互変換 か JSON周りだと思うので、その辺について気をつける必要があることについてがわかると良いのかもしれないですね。

一応、過去のECMAScriptにRegExp.escapeを追加しようという話がありましたが、このプロポーザルの策定は中止されてましたね。 (経緯は忘れましたが、何か原理的に難しい要因があったような気がします。なのでこの話もベストな解がないのかもしれないですね)

azu commented 5 years ago

これは #643 でかいけつ