Edited at

JSONはECMAScript(before 2019)のサブセットではなかった

今日、以下のツイートがタイムラインを流れていました。

ES2019の新機能を紹介しているツイートですが、その中で私が驚いたのは


JSON ⊂ ECMAScript


という部分です。これは、言い換えるとES2019より前はJSONはECMAScriptの(構文的な)サブセットではなかったということになります。これまで、JSONの謳い文句としても、そして、実際にJSONの仕様を読んだり使ったりした限りでも、サブセットでない挙動を経験したことがなかったので、これはどういうことだろう、としばらく考えていました。そんなところに、 @kinabaさんが以下の文献を紹介してくれました:

https://github.com/tc39/proposal-json-superset/blob/master/README.md

ここに書いてあることは、JSONはU+2028U+2029をエスケープしないで文字列の中に埋め込めるが、ECMAScriptの文字列リテラルには、そのような文字をエスケープして埋め込むことができない、ということのようです。この、U+2028U+2029に関する問題を私が知らなかったためにこれまでそのことに気づかなかったのでした。

JSONは当然のように(厳密に)ECMAScriptのサブセットだと思っていたので、ちょっとした驚きでした。

(なお、この辺の問題には詳しくないので、ツッコミをお待ちしています)。