JavaScript 配列の中に特定の値があるかを確認する場合に indexOf を使わない方が良い理由

例えば、配列の中に hoge という文字列があるかを確認する場合に、indexOf を使うことがあると思います。

const arr = [1, 'hoge', true]
const hasHoge = arr.indexOf('hoge') !== -1
console.log(hasHoge) // true

しかし、この indexOf というのは、本来は引数に渡した値が配列のどこに登場するかをチェックするものであり、もしなかったら−1を返します。

存在するかどうか、というシンプルなことをしたいのに、登場する位置を取得してそれが−1でなければ存在する、という一つステップをはさんでいます。

物事を考えたりするときに、間に不要なステップがあると誤解を生んだりするのと同様に、プログラミングでもできるだけ不要なステップは挟まない方が良いです。

現にこのやり方には、以下のような落とし穴があります。

const arr = [NaN]
const hasNaN = arr.indexOf(NaN) !== -1
console.log(hasNaN) // NaN は配列に含まれているのに false になる!

以上から、配列にある値が存在するかどうかは、それ専用の includes をつかいましょう。これであれば先ほどの NaN の例でも、想定通り true が返ります。

const arr = [NaN]
const hasNaN = arr.includes(NaN)
console.log(hasNaN)// true

プログラミングに限らず、物事を考えたり人に伝えたりする時は、余計なステップがないかを意識することが重要です。