JavaScript includes() vs indexOf() - 要素の存在チェック

Array.includes()とindexOf()で要素の存在チェックを比較。NaNの扱い、fromIndex、Setの使い分けを含みます。無料リファレンス。

Search

詳細な説明

includes() vs indexOf()

両メソッドとも配列に特定の値が含まれるかチェックしますが、戻り値の型とNaNの扱いが異なります。

Array.includes()

booleanを返します:

const fruits = ["apple", "banana", "cherry"];
fruits.includes("banana");  // true
fruits.includes("grape");   // false

Array.indexOf()

最初の出現のインデックスを返すか、見つからない場合は**-1**:

const fruits = ["apple", "banana", "cherry"];
fruits.indexOf("banana");  // 1
fruits.indexOf("grape");   // -1

重要な違い:NaNの扱い

const arr = [1, 2, NaN, 4];
arr.includes(NaN);  // true  ✓
arr.indexOf(NaN);   // -1    ✗(NaNを見つけられない!)

パフォーマンス:Setを使うべき場合

頻繁なルックアップには先にSetに変換:

// ルックアップごとにO(n)
array.includes(value);

// O(n)のセットアップ後、ルックアップごとにO(1)
const set = new Set(array);
set.has(value);

ユースケース

includes()はシンプルなメンバーシップチェック(権限チェック、許可値に対する入力検証)のデフォルトとして使用します。indexOf()は要素の位置が必要な場合のみ使用します。多くのルックアップがあるパフォーマンス重視のコードにはSetに切り替えます。

試してみる — JavaScript Array Methods Reference

フルツールを開く