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ブラウザでも、同じ時期に利用可能となっているため、最新のブラウザであれば問題なく使用可能。
引数が 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 は末尾を簡単に取得するために生まれたメソッドな気がする。
Javaの IndexOutOfBoundsException のように、配列の範囲外の添え字を指定すると例外が発生するならともかく、JavaScriptの場合、配列長を超える値をブラケット演算子に渡してもエラーにならず undefined が返っているので、負数を指定できること以外、ブラケット演算子と差異がないんだよなあ。
ちなみに、 slice(-1)[0] の書き方をした同僚は、「配列の末尾 javascript」で検索して出てきたQiitaの記事を読んだみたい。
ここも、コメントを最後まで読むと at(-1) がコメントされている。