JavaScriptで配列の末尾の値を取得したいときはat(-1)が使える

Node.jsで、ファイル名から拡張子を取るときに、 fileName.split('.').slice(-1)[0] という書き方を同僚がしていた。

Node.jsのバージョンを18にしていたので、コードレビューで、「配列の末尾を取りたいなら .at(-1) でいいよ」と指摘したら、 at を知らなかったのでメモ。

Array.at について

Node.jsの場合、v16.6.0以降であれば使用可能。比較的新しいメソッドだが、v16.6.0のリリースが2021/7/29なので、使えるようになってから2年近く経っている。主要なWebブラウザでも、同じ時期に利用可能となっているため、最新のブラウザであれば問題なく使用可能。

developer.mozilla.org

引数が 0 ~ length の間であれば、ブラケット演算子によるアクセスと同じ値を返す。また、 length よりも大きい引数であれば、ブラケット演算子と同様、 undefined を返す。

結果が異なるのは引数が負数の場合。ブラケット演算子であれば常に undefined を返すが、 at の場合は 引数 + length の値を返す。

配列の末尾の値の取得

at の引数が負数の場合の性質により、空配列でなければ、配列長にかかわらず at(-1) は配列の末尾の値を返す。

console.log([1, 2, 3].at(-1)) // 3
console.log([1, 2].at(-1)) // 2
console.log([1].at(-1)) // 1
console.log([].at(-1)) // undefined

MDNには、わざわざ「配列の末尾の値を返す」例が載っている。「メソッドの比較」として、ブラケット演算子length を使ったパターンや、 slice を使ったパターンとの比較があるが、 at を使うのが最も分かりやすいだろう。

振り返り

at は末尾を簡単に取得するために生まれたメソッドな気がする。

JavaIndexOutOfBoundsException のように、配列の範囲外の添え字を指定すると例外が発生するならともかく、JavaScriptの場合、配列長を超える値をブラケット演算子に渡してもエラーにならず undefined が返っているので、負数を指定できること以外、ブラケット演算子と差異がないんだよなあ。

ちなみに、 slice(-1)[0] の書き方をした同僚は、「配列の末尾 javascript」で検索して出てきたQiitaの記事を読んだみたい。

qiita.com

ここも、コメントを最後まで読むと at(-1)コメントされている