👋

空配列に対するArray.prototype.every()の挙動

2024/08/29に公開2

はじめに

この記事は、きちんとドキュメントを読まずにメソッドを使用した自分への戒めであり、記事というよりメモ書きのようなものです。

Array.prototype.every()の基本的な挙動

Array.prototype.every()は下記のように、配列内の要素が特定の条件に当てはまるかチェックし、条件に合わない場合はfalseを返します。

const array = [10, 20, 30, 40, 50]
const result = array.every((a) => a < 30)
console.log(result) // false

逆に言えば、下記のように全ての要素が条件を満たした時にtrueを返すということです。

const array = [10, 20, 30, 40, 50]
const result = array.every((a) => a > 0)
console.log(result) // true

これらのことから、私はevery()を配列の要素が全て条件を満たせばtrueを返すメソッドと認識していました。間違いではなさそうです。

空配列に対するArray.prototype.every()の挙動

では、空配列の場合はどうなるのか。
条件を満たさないのだからfalseだろうと、勝手に思っていました。

しかし、MDNにはこのように書かれていました。

every は数学における「∀ (すべての / for all)」記号と同様のふるまいをします。特に、空の配列に対しては true を返します。(空集合のすべての要素が与えられた任意の条件を満たすことは空虚に真です。)

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/every

そう、trueです
理由は、「空集合のすべての要素が与えられた任意の条件を満たすことは空虚に真」だからだそうです。
ここで出てきた「空虚に真」は調べても難しいのでざっくりとですが、「前提となる条件に対して偽ではないのだから、真だろう」という考え方のようです(本当にざっくりですみません)。

まとめ

今回の件で認識を改め、Array.prototype.every()は配列の要素が全て条件を満たせばtrueを返すメソッドというより、条件を満たさない要素があればfalseを返すメソッドとして使用していこうと思います。

NCDCエンジニアブログ

Discussion

standard softwarestandard software

興味深い挙動だったので、以前、話題になったときにURLをメモしていました。
ここに詳しいこと書かれてました。
【JavaScript】every、someを空配列に対して実行すると... trueを返す?falseを返す? #TypeScript - Qiita
https://qiita.com/whopper1962/items/53b8f07c4571b8cfb2ff

HSHS

教えていただいた記事、非常に分かりやすかったです。
言葉では説明できませんでしたが、イメージはあながち間違いではなく、少し安心しました。
教えていただき、ありがとうございます。