【JavaScript】includes の使い方|配列・文字列の存在チェック・大文字小文字無視・indexOf / some との違いまで解説

includes は、配列や文字列に特定の値が含まれているかを true / false で返すメソッドです。従来の indexOf による !== -1 判定よりも可読性が高く、NaN も正しく判定できるため、モダン JavaScript では存在チェックの第一選択です。

この記事でわかること
・配列の includes の基本構文と動作
・文字列の includes の基本構文と動作
・検索開始位置(第 2 引数)の使い方
・大文字・小文字を無視した検索方法
・NaN の判定で indexOf と結果が異なる理由
・indexOf / some / find との使い分け
・オブジェクト配列での注意点
・ホワイトリスト判定・タグ重複チェック・入力バリデーションの実務パターン
スポンサーリンク

配列の includes の基本

構文
array.includes(searchElement, fromIndex);
// searchElement: 検索する値
// fromIndex:     検索開始位置(省略可、デフォルト 0)
// 戻り値:        true または false
基本例
const fruits = ["りんご", "みかん", "ぶどう", "いちご"];

console.log(fruits.includes("みかん")); // true
console.log(fruits.includes("メロン")); // false

検索開始位置を指定する

第 2 引数 fromIndex を指定すると、そのインデックス以降を検索対象にします。

JavaScript
const nums = [10, 20, 30, 40, 50];

console.log(nums.includes(30, 0)); // true(0番目以降で検索)
console.log(nums.includes(30, 3)); // false(3番目以降には30がない)

// 負の値: 末尾からの位置として解釈
console.log(nums.includes(40, -2)); // true(末尾2つ=[40,50]で検索)

NaN を正しく判定できる

includes は NaN を正しく見つけることができます。これは indexOf にはない重要な特徴です。

JavaScript
const values = [1, NaN, 3];

// includes: NaN を正しく見つける
console.log(values.includes(NaN)); // true

// indexOf: NaN を見つけられない(常に -1)
console.log(values.indexOf(NaN));  // -1
includes は内部的に SameValueZero アルゴリズムを使用しています。これにより NaN === NaN が true として扱われます。indexOf は厳密等価(===)を使うため、NaN === NaN が false になり見つけられません。

文字列の includes の基本

構文
string.includes(searchString, position);
// searchString: 検索する文字列
// position:     検索開始位置(省略可、デフォルト 0)
// 戻り値:       true または false
基本例
const message = "JavaScriptのincludes解説";

console.log(message.includes("includes")); // true
console.log(message.includes("Python"));   // false

// 空文字列は常に true
console.log(message.includes("")); // true

大文字・小文字を区別する

includes は大文字・小文字を区別します。区別しない検索をしたい場合は、両方を小文字(または大文字)に変換してから比較します。

JavaScript
const text = "Hello World";

// そのまま: 大文字小文字を区別
console.log(text.includes("hello")); // false

// toLowerCase() で大文字小文字を無視
console.log(text.toLowerCase().includes("hello")); // true
大文字小文字を無視する関数
function includesIgnoreCase(str, search) {
  return str.toLowerCase().includes(search.toLowerCase());
}

console.log(includesIgnoreCase("JavaScript", "java"));   // true
console.log(includesIgnoreCase("JavaScript", "python")); // false

includes と indexOf の違い

比較項目 includes indexOf
戻り値 true / false インデックス(見つからなければ -1
NaN の判定 正しく判定できる 判定できない(常に -1)
可読性 arr.includes(x)(直感的) arr.indexOf(x) !== -1(やや冗長)
位置の取得 できない できる
ブラウザ対応 IE 非対応 IE 対応
比較例
const colors = ["red", "green", "blue"];

// includes: 直感的
if (colors.includes("green")) {
  console.log("緑が含まれています");
}

// indexOf: 同じ意味だがやや冗長
if (colors.indexOf("green") !== -1) {
  console.log("緑が含まれています");
}
「含まれているかどうか」だけを知りたい場合は includes、「何番目にあるか」を知りたい場合は indexOf を使い分けましょう。

some / find との使い分け

配列の検索には includes 以外にも somefind があります。それぞれ用途が異なります。

メソッド 戻り値 用途
includes(value) true / false プリミティブ値の存在チェック
some(fn) true / false 条件に合う要素があるかの判定
find(fn) 見つかった要素 or undefined 条件に合う要素自体の取得
findIndex(fn) インデックス or -1 条件に合う要素の位置取得
JavaScript
const users = [
  { id: 1, name: "田中", age: 25 },
  { id: 2, name: "鈴木", age: 30 },
  { id: 3, name: "佐藤", age: 22 }
];

// some: 条件に合う要素があるか?
console.log(users.some(u => u.age >= 30)); // true

// find: 条件に合う要素自体を取得
console.log(users.find(u => u.age >= 30)); // { id: 2, name: "鈴木", age: 30 }

// includes はオブジェクトの比較には使えない(後述)

オブジェクト配列での注意点

includes は参照の一致で比較するため、同じ内容のオブジェクトでも別のインスタンスでは false になります。

JavaScript
const obj = { id: 1 };
const arr = [obj, { id: 2 }];

// 同じ参照なら true
console.log(arr.includes(obj));      // true

// 同じ内容でも別のオブジェクトなら false
console.log(arr.includes({ id: 1 })); // false(別インスタンス)

// オブジェクトの内容で検索するなら some を使う
console.log(arr.some(item => item.id === 1)); // true
オブジェクト配列の存在チェックには includes ではなく some を使いましょう。includes はプリミティブ値(数値・文字列・真偽値)の配列で使うメソッドです。

実務でよく使うパターン

ホワイトリスト / ブラックリスト判定

JavaScript
const allowedExtensions = [".jpg", ".jpeg", ".png", ".gif", ".webp"];

function isImageFile(filename) {
  const ext = filename.slice(filename.lastIndexOf(".")).toLowerCase();
  return allowedExtensions.includes(ext);
}

console.log(isImageFile("photo.JPG"));  // true
console.log(isImageFile("doc.pdf"));    // false

重複チェックしてから追加する

JavaScript
const tags = ["JavaScript", "CSS", "HTML"];

function addTag(tag) {
  if (tags.includes(tag)) {
    console.log(`"${tag}" は既に追加済みです`);
    return;
  }
  tags.push(tag);
  console.log(`"${tag}" を追加しました`);
}

addTag("React");      // "React" を追加しました
addTag("JavaScript"); // "JavaScript" は既に追加済みです

入力バリデーション(禁止文字の検出)

JavaScript
function validateUsername(name) {
  const forbidden = ["<", ">", "&", '"', "'"];

  for (const char of forbidden) {
    if (name.includes(char)) {
      return { valid: false, message: `"${char}" は使用できません` };
    }
  }
  return { valid: true, message: "OK" };
}

console.log(validateUsername("tanaka<script>"));
// { valid: false, message: '"<" は使用できません' }

複数キーワードのいずれかが含まれるかチェック

JavaScript
function containsAny(text, keywords) {
  const lower = text.toLowerCase();
  return keywords.some(kw => lower.includes(kw.toLowerCase()));
}

const alertWords = ["urgent", "emergency", "critical"];
const msg = "This is an URGENT notification";

console.log(containsAny(msg, alertWords)); // true

if 文の条件を includes で簡潔にする

複数の値との比較を || で繋げていたコードを、includes でシンプルに書き替えられます。

NG: || を並べる
if (status === "error" || status === "failed" || status === "timeout") {
  showError();
}
OK: includes で簡潔に
if (["error", "failed", "timeout"].includes(status)) {
  showError();
}
比較する値が 3 つ以上になったら includes への書き替えを検討しましょう。可読性が大幅に向上します。

大量データの検索には Set を使う

includes は配列を先頭から順に検索するため、計算量は O(n) です。要素数が数千〜数万になるとパフォーマンスが問題になることがあります。頻繁に存在チェックを行う場合は Set に変換すると O(1) で検索できます。

JavaScript
const largeArray = Array.from({ length: 100000 }, (_, i) => i);

// includes: O(n) — 要素数に比例して遅くなる
console.log(largeArray.includes(99999)); // true(遅い)

// Set: O(1) — 要素数に関係なく高速
const largeSet = new Set(largeArray);
console.log(largeSet.has(99999)); // true(高速)
方法 検索速度 用途
array.includes() O(n) 小規模〜中規模の配列
set.has() O(1) 大規模データ・繰り返し検索

関連記事

よくある質問

Qincludes は大文字・小文字を区別しますか?
Aはい、配列・文字列ともに大文字と小文字を区別します。区別せずに検索したい場合は str.toLowerCase().includes(target.toLowerCase()) のように両方を小文字に変換してから比較します。
Qオブジェクト配列で includes が false を返すのはなぜですか?
Aincludes は参照の一致で比較するため、同じ内容でも別のオブジェクトインスタンスでは false になります。オブジェクトの内容(プロパティの値)で検索したい場合は arr.some(item => item.id === targetId) を使いましょう。
Qincludes と indexOf はどちらを使うべきですか?
A「含まれているかどうか」だけ知りたい場合は includes、「何番目にあるか(位置)」を知りたい場合は indexOf です。includes は NaN を正しく判定でき、戻り値が真偽値で可読性が高いため、存在チェックには includes が推奨されます。
Qincludes は IE で使えますか?
AArray.prototype.includes と String.prototype.includes はいずれも IE 非対応です。IE 対応が必要な場合は indexOf(x) !== -1 で代替するか、ポリフィルを導入してください。
Q配列の要素数が多いと includes は遅くなりますか?
Aはい、includes は先頭から順に検索する O(n) のメソッドです。要素数が数千〜数万で繰り返し検索する場合は、new Set(array) に変換して set.has(value)(O(1))を使うとパフォーマンスが大幅に改善します。

まとめ

includes は配列と文字列の存在チェックに使える、シンプルで直感的なメソッドです。

  • 基本: arr.includes(value) / str.includes(text) で true / false を返す
  • NaN 対応: indexOf と違い NaN を正しく判定できる
  • 大文字小文字: 区別する。無視するなら toLowerCase() で変換
  • オブジェクト配列: 参照比較のため some を使う
  • 大量データ: Set に変換して has() で O(1) 検索

複数の || を並べた条件分岐を includes で書き替えるだけでもコードの可読性は大きく向上します。indexOf との使い分けを押さえ、場面に応じて使い分けましょう。