items.every(check) が true なら送信可能、とするコード。データがそもそも届いていなくても、その判定を通ることがあります。every は「1件以上あること」まで保証しません。
今回は、Node.js v24.14.1で返り値とコールバックの実行回数を確認しました(2026-10-17)。目的は性能比較ではなく、検査していないデータを「全件合格」と扱わないための条件整理です。
空配列では、検査関数が0回でもtrue
let calls = 0;
const passed = [].every(score => {
calls++;
return score >= 60;
});
console.log(passed, calls); // true 0
80点と90点なら true / 2回、80点と50点なら false / 2回、空配列では true / 0回 でした。空の配列そのものをifに渡したときのtruthy判定とは別です。ここでは every というメソッドが、真偽値の true を返しています。
「条件に反する要素が見つからなければtrue」という理解なら、検査対象が0件でも矛盾しません。しかし、アプリの要件が「1件以上選び、全件が合格」なら、そのまま使うには条件が足りません。
const scores = [];
const canSubmit =
scores.length > 0 && scores.every(score => score >= 60);
console.log(canSubmit); // false
なお、「違反がない」という要件なら空配列のtrueが適切なこともあります。常に空配列を禁止する必要はなく、0件をどう扱うかを別に決めます。
lengthだけでは、穴のある配列を防げない
const scores = new Array(3);
let calls = 0;
const passed = scores.every(score => {
calls++;
return score >= 60;
});
console.log(scores.length, passed, calls); // 3 true 0
長さ3でも、各位置に値が入っているわけではありません。every は穴を飛ばすので、ここでも検査は0回でした。length > 0 を付け足しても、この例は通ります。
手元で通常のJSON配列を受け取るケースと、自分で new Array(n) を使って組み立てるケースは区別できます。穴も不正扱いしたいなら、値を埋めた配列に変えて検査する方法があります。
const scores = new Array(3);
const dense = Array.from(scores);
const passed = dense.length > 0 && dense.every(score =>
Number.isFinite(score) && score >= 60
);
console.log(passed); // false
この例では、穴が undefined となり、有限の数値かどうかで落ちます。文字列の "80" を合格にしたい仕様なら、数値への変換方法を別に決めてください。
every(async ...) は完了を待たない
const scores = [80, 50];
const passed = scores.every(async score => score >= 60);
console.log(passed); // true
非同期関数の返り値はPromiseです。Promiseオブジェクトはtrue相当なので、解決後の false はこの判定に使われません。
const scores = [80, 50];
const results = await Promise.all(
scores.map(async score => score >= 60)
);
const passed = results.length > 0 && results.every(Boolean);
console.log(passed); // false
この書き方は、値が入った通常の配列を前提にしています。穴も入力されうるなら、Array.from などで整えてから、各値の検証を行います。また、処理が失敗してPromiseがrejectされた場合の扱いは、合格・不合格の判定と別に必要です。
否定のsomeでも、比較の条件には注意
!scores.some(score => score < 60) も、空配列ならtrueです。さらに、点数が undefined の場合、undefined < 60 はfalseになるため「不合格は一つもない」に入ってしまいます。一方、every(score => score >= 60) はこの値にfalseを返します。
「60点未満がない」と「全て60点以上」は、入力に数値以外が入ると同じ式ではありません。AIが条件を短く書き換えたときも、空・不正な値・非同期処理を分けて確認すると、差が見えます。
参考: ECMAScript仕様のevery、MDNのevery解説
未経験者向けの講座を運営しています
未経験から Next.js + Supabase + Claude Code で Webアプリを公開するまで を、全24セッションで体系化した教材です。
- ▶ ライブデモ(インストール不要・無料)→ https://trial-web-ayies128s-projects.vercel.app/?ref=qiita
- 教材完全版+月5,500円のメンタリング→ https://menta.work/plan/20251?ref=qiita
- 無料体験版(最初の数セッション分・⭐ Starもよろしくお願いします)→ https://github.com/ayies128/next-ai-camp-trial
- YouTube『AIエンジニア情報局』(AI×開発ニュースを扱う別運営チャンネル・無料)→ https://www.youtube.com/channel/UC1rXVD9WYsQPQEWZyd-A1KA/?ref=qiita
※ 中上級者には易しすぎる内容なので、初心者の知り合いへの紹介や社内研修の参考としてどうぞ。