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)
がコメントされている。