ECMAScript仕様輪読会 #45
前回: ECMAScript仕様輪読会 #44
Scrapboxの招待リンク: https://scrapbox.io/projects/esspec/invitations/85b96c9fa718ce5185e307196ed8fb53
connpass: https://esspec.connpass.com/
Discord: https://discord.gg/59S3y6weQj
ES Spec Draft: https://tc39.es/ecma262/
読み物リスト
Twitter hashtag: #esspec
便利ツール
esspec-memo: https://tars0x9752.github.io/esspec-memo/esspec.html
Scrapbox Codeblock Generator: https://vzvu3k6k.github.io/scrapbox-codeblock/
TC39 Terminology: https://github.com/tc39/how-we-work/blob/main/terminology.md
時事ネタ
https://nextwebconf.connpass.com/event/300174/
自己紹介 (近況報告)
syumai syumai.icon
Twitter: https://twitter.com/__syumai GitHub: https://github.com/syumai
書影が出ました
https://gihyo.jp/magazine/SD/archive/2023/202312
tars0x9752.icon sugoi
Software DesignでCloudflare Workersの連載を始めます
多分半年くらい
tars0x9752 (たーず / naoki aoyama) tars0x9752.icon
あつい
たしかにyebis0942.icon
iwatsurut
とくに、イベントもなく過ごしています。
adobe photoshop の Web 版に Lit というのが使われているらしいので少し見ています。
tars0x9752.icon photoshop の web 版があるのか...
yebis0942yebis0942.icon
https://www.youtube.com/channel/UCHMmZqchxs-kiBEEyoIUkNw
おもしろYouTubeチャンネルです
https://www.youtube.com/watch?v=NatwshCTe_4
https://nlp-colloquium-jp.github.io/
Jekyll製でした
(自分は最近はNext.jsとかAstroとか使いがち)
前回のあらすじ
今回の範囲
読み物リスト
String Literals
LegacyOctalEscapeSequence
code:js
"\0A"
'\x00A'
"\18A"
'\x018A'
"\19A"
'\x019A'
"\1A"
'\x01A'
"\07A"
'\x07A'
"\37A"
'\x1FA'
"\47A"
"'A"
"\77A"
'?A'
"\077A"
'?A'
"\377"
'ÿ'
0377 // 8bitの最大値
255
(() => { "use strict"; "\8"; })();
(() => { "use strict"; "\8"; })();
^
Uncaught SyntaxError: \8 and \9 are not allowed in strict mode.
(() => { "use strict"; "\05"; })();
(() => { "use strict"; "\05"; })();
^
Uncaught SyntaxError: Octal escape sequences are not allowed in strict mode.
https://github.com/tc39/ecma262/pull/2054
最近まで\8などの扱いが未定義だった
文章に出てくるXSとは
https://github.com/Moddable-OpenSource/moddable
IoT分野で使われる組み込みJavaScriptエンジン
Static Semantics: Early Errors
code:js
function invalid() { "\7"; "use strict"; }
Use Strict Directiveが前に遡って効く。
前に出てきた似たパターン
code:js
function yield() { "use strict"; }
code:js
const a = "\
\
a\
\
b\
\
";
console.log(a); // ab
console.log(a.length); // 0
const s = "
a
b
";
console.log(s);
console.log(s.length); // 5
const s2 = "\
a\
b\
";
console.log(s2);
console.log(s2.length); // 2
LineContinuation
空文字になる(\に続く改行文字は無視される)
改行っぽい文字の振る舞い
LineTerminator: <LF>, <CR>, <LS>, <PS>
文字列リテラル内に裸で出現できるものとできないものがある
<LF>, <CR>: できない
<LS>, <PS>: できる
しかし、\によるLineContinuationを適用するとすべて空文字になる
Static Semantics: SV
LegacyOctalEscapeSequenceについて
The SV of EscapeSequence :: LegacyOctalEscapeSequence is the String value consisting of the code unit whose numeric value is the MV of LegacyOctalEscapeSequence.
📝 LegacyOctalEscapeSequenceのMVと書いてあるが、例えば 377 は数値リテラルとしてはただの377になってしまう。
TemplateEscapeSequence
まだ定義されていない文法定義だった
Static Semantics: MV
Number LiteralのMVでカバーできていないものだけ定義されていそう
Regular Expression Literals
code:js
/a/ === /a/ // 常にfalse
Regular Expression Literalによって取り出された正規表現は、さらにECMAScript Regular Expression grammarによってパースされる
ECMAScript Regular Expression grammarは処理系が拡張してもよい
Syntax
but not one of * or \ or / or [
/* はコメントの開始なので除外されていそう
📝Template StringがLegacyOctalEscapeSequenceを許可しない根拠があまり明確でない?
実はここにあった
https://tc39.es/ecma262/#sec-static-semantics-template-early-errors
LegacyOctalEscapeSequenceに相当する文字列はNotEscapeSequenceにマッチし、Early ErrorsでこれをSyntax Errorとしている
\あとかもSyntax Errorにしてほしい気もするyebis0942.icon