2022-09 の TC39 meeting
まとめ
Note:
決まったこと
Web compatibility issues / Needs Consensus PRs
N/A
Stage 4 (ES2023)
N/A
Stage 3
期間を表す文字列を生成する提案。
code: js
const df = new Intl.DurationFormat('jp', { style: 'long' });
df.format({ years: 1, months: 2, days: 3 }); // => 1年2ヶ月と3日
Tempral.Duration を受け入れられるデザインになっており、以下のプロパティを持つオブジェクトを受け入れる。
years
months
weeks
days
hours
minutes
seconds
milliseconds
microseconds
nanoseconds
Stage 3 になった。
文字列のフォーマットの議論をしていた IETF SEDATE Working Group で承認され、ひとまず Internet Extended Date-Time Format (IXDTF) として進めていくことになった。IXDTF では Java でデファクトスタンダードとして扱われている文字列フォーマットの仕様も取り入れて策定を進めるということなった。
IETF SEDATE からのフィードバックとしてタイムゾーン名とカレンダー名に critical flag (!) を追加する話になっている(PR)。今まで未知のタイムゾーン名が含まれた文字列をパースした際は単に無視していたが、もし critical flag がついていた場合は RangeError を投げる。 もちろん文字列生成時に指定することもできる。
code: js
Temporal.Now.zonedDateTimeISO()
.toString({ calendarName: 'critical', timeZoneName: 'critical' });
ただどうやらこの PR はコンセンサスが得られなかったらしい。
https://gyazo.com/8d774e811680e70d431c97730af9c342
変更点として ShadowRealm 内で発生したエラーは message プロパティだけ受け継いだ TypeError として他の Realm に露出することとなった。
AsyncIterable から配列を作る Array.fromAsync を追加する提案。Array.from で valid な入力は同様に valid 扱いとなるため ArrayLike も受け付けるようになっている(その場合でも await する必要はある)。Stage 3 になった。
Stage 2
引数の raw 配列を元にして生成するように変更された。これによって "\x20" や "\n" のようなエスケープシーケンスを使った際の挙動が変わっている。
code: js
String.dedent`
\x20 foo
`;
// => "\x20 foo"
String.dedent`
foo\n bar
`;
// => "foo\n bar"
変更点として Record.isRecord, Tuple.isTuple が取り除かれ(まあ typeof で事足りる)、JSON.parseImmutable は別の提案としてスプリットされた。
変更点として Iterator#toAsync が追加された。
オープンイシューとして Iterator#forEach は現在 undefined を返すようになっているが、done: true な IteratorResult の value を返すのはどうかという話が出ている。また他にも細かい修正のイシューがたてられている。
Set methods discussion (slides) | Kevin Gibbons Set に集合の演算を追加する提案。前回何を持って SetLike として扱うかが問題となっていたが、その方法を具体的に議論するフェーズに入っている。
1. Symbol.iterator と "has" メソッドを持つやつを SetLike として扱う
2. "keys" と "has" メソッドを持つやつを SetLike として扱う
3. Symbol.iterator と Symbol.setHas を持つやつを SetLike として扱う
4. Symbol.isSet のように SetLike なものにフラグを付ける
@@disposable (@@asyncDisposable) メソッドを持つオブジェクトを using 宣言で変数定義した場合に、そのスコープを抜けるタイミングでリソースを解除するためにそのメソッドを呼び出す提案。
前回からの変更点としてグローバルに増やすクラスが Disposable (AsyncDisposable) から DisposableStack (AsyncDisposableStack) になっている。これは Python の ExitStack を参考にしている。
code: js
class DisposableStack {
constructor();
/**
* Gets a bound function that when called invokes Symbol.dispose on this object.
* @returns {() => void} A function that when called disposes of any resources currently in this stack.
*/
get dispose();
/**
* Adds a resource to the top of the stack.
* @template {Disposable | (() => void) | null | undefined} T
* @param {T} value - A Disposable object, or a callback to evaluate
* when this object is disposed.
* @returns {T} The provided value.
*/
use(value);
/**
* Adds a resource to the top of the stack.
* @template T
* @param {T} value - A resource to be disposed.
* @param {(value: T) => void} onDispose - A callback invoked to dispose the provided value.
* @returns {T} The provided value.
*/
use(value, onDispose);
/**
* Moves all resources currently in this stack into a new DisposableStack.
* @returns {DisposableStack} The new DisposableStack.
*/
move();
/**
* Disposes of resources within this object.
* @returns {void}
*/
}
また using const と宣言していたところを単に using のみで宣言するようになった。Stage 3 にはならなかった。
JavaScript の文字列は任意の 16bit 整数が入ってしまうようになっている(所謂 WTF-16)。新たに String#isWellFormed を追加し、UTF-16 として正しい文字列になっているか判定できるようにする提案。
今回は新たに String#toWellFormed を追加する話になっている。Stage 2 になった。
Stage 1
Symbol.matcher メソッドを持つオブジェクト(Extractor Objects)で代入演算を拡張する提案。
code: js
const InstantExtractor = {
if (value instanceof Temporal.Instant) {
return { matched: true, value: value }; } else if (value instanceof Date) {
} else if (typeof value === "string") {
} else {
return { matched: false };
}
},
};
class Book {
constructor({
isbn,
title,
// Extract createdAt as an Instant
InstantExtractor(createdAt) = Temporal.Now.instant(),
InstantExtractor(modifiedAt) = createdAt
}) {
this.isbn = isbn;
this.title = title;
this.createdAt = createdAt;
this.modifiedAt = modifiedAt;
}
}
new Book({ isbn: "...", title: "...", createdAt: Temporal.Instant.from("...") });
new Book({ isbn: "...", title: "...", createdAt: new Date() });
new Book({ isbn: "...", title: "...", createdAt: "..." });
Stage 1 になった。
Stage 0
N/A
その他
Refactor of import-related Host Hooks (repo, slides) | Nicolò Ribaudo 総括