Back to Portfolio
May 15, 2026

Array.prototype.every() を空配列で実行するとtrueになる

技術メモ

業務で配列の要素を検証する際にArray.prototype.everyを使っていたところ、空配列に対して実行するとtrueが返るという挙動を知った。

[2, 4, 6].every(num => num % 2 === 0) // 偶数は全て2で割り切れるのでtrue
[1, 2, 4].every(num => num % 2 === 0) // 1は奇数で、すべての要素で条件を満たさないのでfalse

[].every(num => num % 2 === 0) // 評価対象がない場合、true

今まで空配列になり得る配列に対してeveryを実行するみたいなことを考えることがなかったので、なぜこの挙動になるのかについて調べた内容をメモする。

前提

現在(2026/05/15)時点で公開されている最新のECMAScriptの仕様(ECMAScript 2027 - Draft)を参照する。
閲覧時点での仕様はtc39.es/ecma262を、過去の仕様はECMA-262から確認する。

Array.protptype.every() の仕様

23.1.3.6 Array.prototype.every ( callback [ , thisArg ] ) には以下のような記述がある。

every acts like the “for all” quantifier in mathematics. In particular, for an empty array, it returns true.

翻訳: every は数学における「全称量化子(すべての〜について)」と同じ役割を果たします。特に、空の配列に対しては true を返します。

実際のシーケンスとしては以下のように記載されている。

4.Let k be 0.
5.Repeat, while k < len,
 a. Let propertyKey be ! ToString(𝔽(k)).
 b. Let kPresent be ? HasProperty(obj, propertyKey).
 c. If kPresent is true, then.
  i. Let kValue be ? Get(obj, propertyKey).
  ii. Let testResult be ToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), obj »)).
  iii. If testResult is false, return false.
 d. Set k to k + 1.
6.Return true.

kを0とし、k < lenが成立する間はeveryのコールバックとしての関数を実行する。その中で条件を満たさないものがあればfalseを返し、そうでなければ最終的にtrueを返す。(kをインクリメントすることで配列の要素数分再起処理を行なう)
空配列の場合はlen === 0なので、5. Repeat, while k < lenを初めから満たしておらず、単にtrueを返却する。

数学や論理学においてはこのように評価する対象がない状態を真として扱うようなものを「空虚な真(Vacuous truth)」と呼ぶ。
(より厳密には前件が真にならないため真になる条件文や普遍命題のことを指すらしいのだが、数学よわよわな僕はそもそも普遍命題というのがよくわからなかった。それも以下にメモする。)

普遍命題

普遍命題は「すべての○○について成り立つ」ような命題のこと。
(ちなみに命題は真か偽がを明確に判断できる条件分のこと。 鯛は魚である。 みたいな。)
数式だと以下のように書く。

∀x P(x)

つまり すべての鯛は魚である。 とか、 すべての偶数は2で割り切れる。 みたいなもの。
すべての(for-all)は数学では(全称記号)で表す。こんなんキタ━━━━(゚∀゚)━━━━!!でしか見たことがない。
xは評価対象、Pは命題を指している(と思う)。
先の数式に当てはめると、「すべてのxが偶数ならば、xは2で割り切れる。」と言い換えることができる。

普遍命題が偽として判定されるには「反例」の存在が必要で、xがPを満たさない条件が存在する場合に偽となる。
例としては、「すべての鳥は飛べる。」という普遍命題は飛べない鳥(ペンギンなど)の存在によって反例が存在するため、偽として評価される。

ここら辺も、上述したevery関数のシーケンスと同じ評価方法であることがわかる。(特定の配列の要素が反例となる評価になった時にfalseを返し、なければ最終的にtrueを返す)

空配列における「空虚な真」

普遍命題の前件となる条件が存在し得ないか評価対象が存在しない場合、それを否定する反例が存在し得ないため真になる。
例えば「すべてのツチノコは、黄色い。」みたいな場合、そもそも前件となるツチノコの存在が証明できないため、黄色くないツチノコがいるかどうかを説明できない。
説明できないということは「反例」を出せないので真となる。

これを[].every(...)に対して適用すると、空配列(評価対象が存在しない)に対してコールバックで宣言している条件文を満たしているかどうかを評価できない(満たしていないと言える反例となる要素が存在し得ない)としてtrueを返すということになる。


数学よわよわ素人まとめなので、ちゃんと知識のある人が見たらおかしな言い回しがありすぎそう。このノートを見た人については、鵜呑みにせず自分なりに調べてみてほしい。
僕の理解は、「Array.protptype.every() は普遍命題の考え方に沿って仕様が決められており、空配列は普遍命題の反例となりうる要素が存在しないためtrueを返すようになっている」という整理。

trueと評価できる要素がひとつもないのにtrueが返ってくるという挙動に最初は結構違和感があったが、調べたらちゃんと根拠があって納得した。
それにしても数学に弱すぎて数式を見た瞬間に頭がフリーズするのでちゃんと勉強したほうがいい気がしてきた。