【JavaScript】ES2023の新機能

[ES2023その2](https://qiita.com/rana_kualu/items/49c51f4002043b97c59a) / [ES2023](https://qiita.com/rana_kualu/items/84f66fe970f7feccf367) / [ES2022](https://qiita.com/rana_kualu/items/8bafecd760ae69cfac41) / [ES2021](https://qiita.com/rana_kualu/items/ae3297dd2974fcf047c4)

2023年一発目ということで、[ES2023](https://github.com/tc39/proposals)に[Finished Proposals](https://github.com/tc39/proposals/blob/main/finished-proposals.md)として取り入れられた機能を見てみましょう。

ちなみにFinished Proposalは「複数の実装が既に存在する」が前提なので、2023という名前にもかかわらず既に一部のブラウザで使用可能です。
というかES2023の新機能は全てのモダンブラウザで既に使用可能です。


# ES2023

# [Array find from last](https://github.com/tc39/proposal-array-find-from-last)

末尾からの検索です。

```js
const array1 = [5, 12, 8, 130, 4];

console.log(array1.find(element => element > 10));     // 12
console.log(array1.findLast(element => element > 10)); // 130

console.log(array1.findIndex(element => element > 10));     // 1
console.log(array1.findLastIndex(element => element > 10)); // 3
```

Arrayは[indexOf](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)と[lastIndexOf](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/lastIndexOf)で前後からの抽出をサポートしています。

しかし[find](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/find)と[findIndex](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex)については何故か`findLast`・`findLastIndex`がない、という非対称な状態になっていました。
そこで[findLast](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/findLast)、および[findLastIndex](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/findLastIndex)を追加します。
これによって、後方からの検索メソッドが揃うことになりました。

findLastは2022年に[全てのブラウザでサポートされました](https://caniuse.com/?search=findLast)。


# [Hashbang Grammar](https://github.com/tc39/proposal-hashbang)

ファイルの先頭行にある`#!`のみコメントとして扱います。

```js
#! hoge ←これはコメント

#! fuga ←シンタックスエラー
```

シェルスクリプトの冒頭には、自分をどのプログラムで実行するかを指定する[shebang](https://qiita.com/mohira/items/566ca75d704072bcb26f)という仕組みが存在します。
そして、JavaScriptのサーバ側実行環境であるNodeも[shebangを使うことができます](https://zenn.dev/qnighy/articles/d2712de8e4585f749b30)。
しかしJavaScriptにはこのような文法が存在しないので、Nodeと同じコードを使うとシンタックスエラーになってしまいます。
そのせいでNodeとJavaScriptで同じソースを使い回すことができませんでした。

ということで、JavaScriptでは先頭行の最初にある`#!`のみコメントとして扱うことにします。
実際にプログラムが起動されるわけではなく、単なるコメントです。
またコメント扱いされるのは先頭行の先頭のみであり、2行目以降にある場合などはコード扱いとされます。

ブラウザには[2019年ごろには既に実装されて](https://caniuse.com/?search=Hashbang)おり、Proposalがようやく実装に追いついたというかんじです。


# 感想

え？
たったふたつだけ？

はいそうです。
[includes](https://github.com/tc39/proposal-Array.prototype.includes)にはじまった[JavaScriptの近代化改修](https://github.com/tc39/proposals/blob/main/finished-proposals.md)ですが、なぜか2021年の途中あたりから急減速し、2022年はたったの二つだけになってしまいました。
(ES2023は2022年に作られるので、見た目的に一年ずれます)
いきなり勢いが止まってしまったわけですが、これはいったいどういうことなのでしょうか。

[commit数](https://github.com/tc39/proposals/graphs/contributors)はそこまで大きく変わっているわけではなさそうです。
また、[新しいProposalの発行もそれなりに行われている](https://github.com/tc39/proposals/blob/main/stage-1-proposals.md)ので、TC39の活動が停滞していることもなさそうです。
ということは、これはブラウザ側の実装が進んでいないということなのでしょうか？

TC39では[数か月ごとにミーティングが行われ](https://github.com/tc39/notes/tree/main/meetings)、各ブラウザの中の人や関係者が集ってProposalの方向性や進展などを話し合っています。
試しに記事執筆時点で最新の[2022年9月に行われたミーティング](https://github.com/tc39/notes/tree/main/meetings/2022-09)を覗いてみると、Stage3に到達してから1年以上経ってる[Temporalの仕様調整が未だに難航して](https://github.com/tc39/notes/blob/main/meetings/2022-09/sep-13.md#temporal-update)いたりしました
このような齟齬が進捗停滞の理由の一端なのかもしれません。
まあ[全](https://github.com/tc39/notes/blob/main/meetings/2022-09/sep-14.md)[部](https://github.com/tc39/notes/blob/main/meetings/2022-09/sep-15.md)読んだわけじゃないからわかりませんけどね。