Array.prototype.includes() と some() / every()

値が入っているかを調べる includes、条件で調べる some と every の違いをまとめます。 NaN が見つかる理由、型が違うと一致しない話、空配列で every が true になる理由まで確かめます。

実行して検証済み処理系Node 22.22.3対応ES2016難易度●●○○○目安7更新

「入っているか」を調べる方法は3つあります。何で調べたいかで選びます。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
true true true
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
true -1 true 2
何で調べるか 返るもの
includes() 値そのもの 入っていれば true
some() 条件(1つでも) 1つでも合えば true
every() 条件(全部) 全部合えば true

上のコードは書き換えて実行できます。n > 2n > 5 にしてみてください。

includes と indexOf の違い

NaN を見つけられるかどうかが違います。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
false true false
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
false true

indexOf()=== で比べます。NaN === NaNfalse なので見つかりませんincludes()SameValueZero という比べ方を使うので見つかります

詳しくは なぜ NaN === NaN は false なのか にあります。

「あるか」を知りたいだけなら includes() を使ってください。 indexOf(x) !== -1 は読みにくく、NaN で間違えます。

型が違うと一致しない

includes()型変換をしません

javascript
const users = [{ id: 1 }];

console.log(users.includes({ id: 1 }));
false
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
true true

フォームから来た値は文字列です。そのまま渡すと必ず false になります。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
some : 2 every : 2
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
false true

変換の注意は 文字列を数値に変換する にあります。

オブジェクトは参照で比べる

中身が同じでも、別々に作ったものは別物です。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
true false
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
true -1

中身で調べたいなら some() を使ってください。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
true true false true
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
true 2 true true

見つかったところで止まる

some() は真になった時点、every() は偽になった時点で止まります

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
false true
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
true true

どちらも5件のうち2件しか見ていません。

includes() も途中で止まりますが、回数は数えられません(関数を渡さないため)。

空配列では every が true になる

ここが引っかかりどころです。

every() は「条件に合わないものが1つも無い」を返します。 要素が0件なら、合わないものも0件です。だから true です。

数学ではこれを空虚な真と呼びます。仕様どおりの正しい動きです。

実務では困ることがあります。「全員が同意したか」を every() で調べると、 誰もいないときに「全員同意」になります。

件数を先に確かめてください。

穴のある配列での違い

includes()疎な配列の穴を undefined として見ますindexOf()飛ばします

find() と同じで、includes() は穴を見に行きます。 filter()map() は飛ばします。揃っていません。

途中から探す

第2引数で開始位置を指定できます。

負の数は後ろから数えます。-1 は最後の要素からです。

文字列にも includes がある

同じ名前で、部分文字列を調べます。

配列の includes()要素そのもの、文字列の includes()部分文字列です。 名前は同じでも、調べているものが違います。

選び方

やりたいこと 使うもの
その値が入っているか includes()
条件に合うものが1つでもあるか some()
全部が条件に合うか every()空配列に注意
合うものを取り出したい find()
合うものを全部取り出したい filter()
何番目かを知りたい indexOf() / findIndex()

filter(...).length > 0 と書かないでください。 最後まで数えてしまいます。 some() なら見つかった時点で止まります。

この記事の根拠

  1. Array.prototype.includes — ECMAScript® 2026 Language Specificationtc39.es
  2. Array.prototype.some — ECMAScript® 2026 Language Specificationtc39.es
  3. Array.prototype.every — ECMAScript® 2026 Language Specificationtc39.es

掲載しているコード例は、公開前に読み手が押したときに動くのと同じもので実行して出力を突き合わせています。結果はリポジトリに残しています。

このページの原文(Markdown)