includes は、配列や文字列に特定の値が含まれているかを true / false で返すメソッドです。従来の indexOf による !== -1 判定よりも可読性が高く、NaN も正しく判定できるため、モダン JavaScript では存在チェックの第一選択です。
この記事でわかること
・配列の includes の基本構文と動作
・文字列の includes の基本構文と動作
・検索開始位置(第 2 引数)の使い方
・大文字・小文字を無視した検索方法
・NaN の判定で indexOf と結果が異なる理由
・indexOf / some / find との使い分け
・オブジェクト配列での注意点
・ホワイトリスト判定・タグ重複チェック・入力バリデーションの実務パターン
・配列の 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 以外にも some や find があります。それぞれ用途が異なります。
| メソッド | 戻り値 | 用途 |
|---|---|---|
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) | 大規模データ・繰り返し検索 |
関連記事
- indexOf の使い方 — 文字列・配列の位置検索と includes との違い
- some で配列の要素が条件に一致するか判定する方法
- 配列から条件に合う要素を取り出す方法 — filter の活用
- slice の使い方 — 配列・文字列の切り出し
- 配列の重複を削除する方法 — Set・filter の活用
- match で文字列パターンを検索する方法
よくある質問
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 との使い分けを押さえ、場面に応じて使い分けましょう。