空配列に対するArray.prototype.every()の挙動
はじめに
この記事は、きちんとドキュメントを読まずにメソッドを使用した自分への戒めであり、記事というよりメモ書きのようなものです。
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 を返します。(空集合のすべての要素が与えられた任意の条件を満たすことは空虚に真です。)
そう、trueです
理由は、「空集合のすべての要素が与えられた任意の条件を満たすことは空虚に真」だからだそうです。
ここで出てきた「空虚に真」は調べても難しいのでざっくりとですが、「前提となる条件に対して偽ではないのだから、真だろう」という考え方のようです(本当にざっくりですみません)。
まとめ
今回の件で認識を改め、Array.prototype.every()は配列の要素が全て条件を満たせばtrueを返すメソッドというより、条件を満たさない要素があればfalseを返すメソッドとして使用していこうと思います。
NCDC株式会社( ncdc.co.jp/ )のエンジニアチームです。 募集中のエンジニアのポジションや、採用している技術スタックの紹介などはこちら( github.com/ncdcdev/recruitment )をご覧ください! ※エンジニア以外も記事を投稿することがあります
Discussion
興味深い挙動だったので、以前、話題になったときにURLをメモしていました。
ここに詳しいこと書かれてました。
【JavaScript】every、someを空配列に対して実行すると... trueを返す?falseを返す? #TypeScript - Qiita
教えていただいた記事、非常に分かりやすかったです。
言葉では説明できませんでしたが、イメージはあながち間違いではなく、少し安心しました。
教えていただき、ありがとうございます。