ECMAScript仕様輪読会 #59
前回: ECMAScript仕様輪読会 #58
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
21:02 再開
便利ツール
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://github.com/tc39/agendas
https://github.com/tc39/notes
/petamoriken/2024-04 の TC39 meeting
https://github.com/tc39/proposals
自己紹介 (近況報告)
syumai syumai.icon
Twitter: https://twitter.com/__syumai GitHub: https://github.com/syumai
Go / TSを書いて暮らしてます
昨日、原稿の入稿が完了しました
金曜、Go Conference Pre Partyで話します
iwatsurut
とくに、イベントもなく過ごしています。
js の話題ではないが、先々週末 Kansai.go に参加しました。
Gmail の受信の条件が厳しくなって、面倒に少し巻き込まれています。
tomato3713tomato3713.icon
https://twitter.com/tomato3713
Go/TS/Perlを書いてます。
GitHub Copilot Chat に猫になりきらせたりして遊んでいた
https://tomato3713.hatenablog.com/entry/2024/05/29/211918
tars0x9752 (たーず / naoki aoyama) tars0x9752.icon
https://github.com/tars0x9752
肛門周囲膿瘍になるなど、体調を崩していた
前回のあらすじ
Iterator の仕様をひたすら読んでいた
今回の範囲
https://tc39.es/ecma262/#sec-functiondeclarationinstantiation のStep 25, 26から
code:js
const end = 10;
let count = 0;
const it = {
next() {
if (count < end) {
count++;
return 1;
}
return { done: true };
},
};
const obj = {
Symbol.iterator: () => it,
};
for (const val of obj) {
// TypeError: Iterator result 1 is not an object
console.log(val);
}
https://tc39.es/ecma262/#sec-iteratorstep
4. Set done to ! done.
done は Normal Completion か Throw completion で step 3で throw completion の場合を処理しているので、step 4の!は normal completion である done をdoneにセットするというニュアンスのためだろう
IteratorNext
async じゃないイテレーターをasyncをつけても呼べる機能があって、そこでも使いまわせるように分割してそう
code:js
const a = 1, 2, 3;
for await (const v of a) {
console.log(v);
}
AsyncFromSyncIterator
https://tc39.es/ecma262/#_ref_14394
IteratorClose
Iteratorの消費が中途半端になってしまった時に、終了処理(return method)を呼び出すのに使われる
例: ArrayBindingInitialization
code:js
const end = 4;
let count = 0;
const iterator = {
next() {
if (count < end) {
count++;
return { done: false, value: count };
}
return { done: true };
},
return: () => {
console.log("returned!");
return { done: true };
},
};
const iterable = {
Symbol.iterator: () => iterator,
};
function f(a, b, c) {
console.log(a, b, c);
}
f(iterable);
// returned!
// 1 2 3