every() と some() — 全部か、1つでもあるか

every() は全部が満たすか、some() は1つでも満たすかを true / false で返します。空配列で答えが逆になること、途中で止まること、includes() との使い分けまで実行して確かめます。

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

どちらも返るのは truefalse だけです。要素は返りません。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
true true false false
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
true false true
使うもの 意味 日本語にすると
every() 全部が満たす 「すべて〜である」
some() 1つでも満たす 「〜が1つでもある」

いちばんの落とし穴:空の配列

javascript
function canSubmit(errors) {
return errors.every((error) => error.level === 'warn');
}

console.log(canSubmit([{ level: 'warn' }]));
console.log(canSubmit([]));
true true
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
true false

空の配列に every() を使うと、いつでも true です。 条件の中身は1度も呼ばれません

これは間違いではなく、反例が1つも無いという意味です。 数学の「すべての〜」と同じ決まりで、空虚な真と呼ばれます。

事故になるのはこういう形です。

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

読み込みに失敗して errors が空だったときも true になります。 「空かどうか」は別に確かめてください。

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

「空なら通す」が正しい場面もあります。決めるのは仕様であって、既定の挙動ではありません。

答えが出たところで止まる

javascript
const check = async (n) => n > 100;

console.log([1, 2, 3].every(check));
console.log([1, 2, 3].some(check));
console.log(typeof check(1));
true true object
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ false, false, false ] false false
  • every()最初の false で止まる
  • some()最初の true で止まる

重い判定を書いても、全部は走りません。 逆に言うと、条件の中で全要素に副作用を起こす書き方は壊れます。数を数えたいなら filter().length を使ってください。

includes() との使い分け

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
false [ 'email' ]
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
a 0 2 b 1 2

includes() が見るのは同じ値かどうかです。 見た目が同じでも、別に作ったオブジェクトは一致しません。

中身の条件で探すなら some() です。 → includes() / indexOf()

似ているものとの違い

欲しいもの 使うもの 返るもの
全部が条件を満たすか every() true / false
1つでもあるか some() true / false
その要素 が欲しい find() 要素 or undefined
条件に合うもの全部 filter() 配列
何件あるか filter().length

「あるかどうか」だけ知りたいのに filter() を書くと、 要らない配列を作ってから捨てることになります。

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

答えは同じですが、some()見つかった時点で止まります

返す値は真偽値でなくてよい

返した値は真偽値として見られます。 空のオブジェクトや空の配列は true 側、0 と空文字は false 側です。 → なぜ === を使うのか

よくある間違い:非同期の条件を渡す

どちらも true です。中身は1つも 100 を超えていません。

async を付けた関数が返すのは Promise です。 Promise必ず真なので、every() は全部通り、some() は最初で止まります。 await を書く場所がありません。

先に全部走らせて、結果の配列で判定してください。

複数の非同期処理を同時に走らせる

オブジェクトに使うとき

every()some() は配列のものです。 オブジェクトなら、いったん配列にしてください。

「揃っているか」だけなら every()、「どれが足りないか」なら filter() です。 → Object.keys() / values() / entries()

条件には3つ渡ってくる

使わない引数は書かなくて構いません。

穴のある配列では呼ばれない

length は3ですが、条件は2回しか呼ばれません。 undefined が入っているのとは違います。 → 配列の穴

まとめ

  • 返るのは true / false だけ。要素は返らない
  • 空の配列で every()truesome()false
  • every() は最初の falsesome() は最初の true で止まる
  • 中身の条件で「あるか」を見るならincludes ではなく some
  • 要素そのものが欲しいなら find()、全部欲しいなら filter()
  • 穴のある配列では条件が呼ばれない
  • async の条件は必ず true になる。 Promise.all() で先に走らせる

この記事の根拠

  1. Array.prototype.every — ECMAScript® 2026 Language Specificationtc39.es
  2. Array.prototype.some — ECMAScript® 2026 Language Specificationtc39.es
  3. Array.prototype.every() — MDNdeveloper.mozilla.org

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

このページの原文(Markdown)