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に切り替えます。