メインコンテンツまでスキップ

トゥルーとフォルスとトゥルーシーとフォルシー

前置き

boolean型の値であるtruefalseというこれらの値、プログラミング初心者の方や高校で簡単なC言語だけをやった人間だとあまり必要性を感じないかもしれないので、 これらが何を表現し、なぜこれを使うのが良いのかについて解説します。

また、後半ではJavaScriptにおけるトゥルーシー、フォルシーなどと呼ばれる物についても解説します。

truefalse

まずはこれらの値がどんな時に発生するのかをみていきましょう。

/* (1) */ 10     <   100    // true
/* (2) */ 1000 < 100 // false
/* (3) */ "hoge" === "hoge" // true
/* (4) */ "hoge" === "fuga" // false

まだまだ他の演算子によって生まれますが冗長なのでこの辺で。

これらを見ると、左項と右項が演算子の表す関係性を満たす時にtrueを、そうでない時にはfalseを返していることがわかります。

これらは数学における命題とその真偽に当たることがわかります。例えば、

  • (1)は「10は100未満である」という命題を表しており、これは真、つまりtrueです
  • (2)は「1000は100未満である」という命題を表しており、これは偽、つまりfalseです

そしてif文などを組み合わせることによって、「もし命題Aが真ならば処理Oを実行する」という様な表現が可能となるわけです。

なんでtruefalseが必要?

JS含め色々な言語でtruefalseといった値を使わずともif文の表現が可能です。例えば

if (1) {
// ここは実行される
}
if (0) {
// ここは実行されない
}

の様に真と偽をそれぞれ1と0としても特に問題はありません。

ならこれでもよぐね?と思うのが初心者脳です(二年前の自分)。

しかしどうでしょう、以下の様なプログラムがあったらどう思います?

const a = 1 // この1はtrueを表す1である
const b = 1 // この1は数値の1を表す1である

紛らわしくね?だったらこれの方がわかりやすいぢゃん。

const a = true // これは明らかにtrueを表している!
const a = 1 // trueを表すのにtrueを使うならこれは明らかに数値の1だとわかる!

この様にある特定のものを表現するのであればそのためのものを使う方が脳に優しいわけです。

真偽値の演算

数学の命題にはいくつかの演算が存在します。

例えば離散系論で出てきたやつであれば

  • 「かつ」
  • 「または」
  • 「でない」
  • 「ならば」
  • 「ならばかつその時に限り(if and only ifを略してiffなどとも)」

などです。下二つは今回必要ありませんが、2,3,4年生のみんな、ちゃんと覚えてる?

「かつ」は命題A、Bについて新たな命題「AかつB」を生み出すものであり、AとBどちらも真である時にこの命題は真となります。

こういったものは真偽値表というもので表され、

ABAかつB
FalseFalseFalse
FalseTrueFalse
TrueFalseFalse
TrueTrueTrue

同様に他二つも並べると、

ABAまたはB
FalseFalseFalse
FalseTrueTrue
TrueFalseTrue
TrueTrueTrue
AAでない
FalseTrue
TrueFalse

なぜこれらを紹介したかといえば、これらはJS内で表現できるからです。

  • 「かつ」は「&&
  • 「または」は「||
  • 「でない」は「!

をそれぞれ使います。

ただし、JS(TS)内でのこれらの演算は純粋に命題論理のそれを表すものではなく、真偽値以外の値についても扱うことに注意が必要です。これについてはのちの節でやります。

トゥルーシーとフォルシー

先ほど、JSのif文では条件式にtruefalseではなく10といったものを使っても動くことを紹介しました。

この1の様に、trueではないがtrueであるかの様に扱われる値をトゥルーシーな値、 対して0の様にfalseではないがfalseであるかの様に扱われる値をフォルシーな値などと呼びます。

トゥルーシーな値は、フォルシーな値ではない奴らのことであり、フォルシーな値の方が絶対数が少ないためこれを紹介する。

フォルシーな値の代表的な例としては、

  • 数値の0
  • 空文字列""
  • undefined
  • null

であり、トゥルーシーな値はこれらでないものほぼ全てです。

真偽値でない値と命題演算

JS(TS)において真偽値でない値が使えるのはif文などの条件式に限りません。先ほど紹介した「&&」や「||」などといった命題演算でも使用できます。

ここでかなり注意が必要なので、真偽値表をよくみてください。

ABA && B
フォルシー?A
トゥルーシー?B
ABA || B
フォルシー?B
トゥルーシー?A
A!A
フォルシーtrue
トゥルーシーfalse

なぜこうなるのか、先ほどの普通の真偽値表と見比べてみましょう。

ABAかつB
FalseFalseFalse
FalseTrueFalse
TrueFalseFalse
TrueTrueTrue

これを見ると、AがFalseの場合必ずFalseを返しているのでこの様に簡略できます。

ABAかつB
False?False
TrueFalseFalse
TrueTrueTrue

また、AがTrueの場合にはBが結果になることがわかりますので

ABAかつB
False?False
True?B

この様に簡略できます。ここでさらにAがFalseの場合Aを返していると見れば

ABAかつB
False?A
True?B

トゥルーシーとフォルシーの心理地表と見比べましょう。

ABA && B
フォルシー?A
トゥルーシー?B

おんなじですね!||に関しても似た様な簡略ができます。

この結果JSにおける命題演算は以下の様なことができます。

true && "aaa"     // -> "aaa"
false && 1 // -> false

undefined && true // -> undefined
{} && [] // -> []

"aaa" || 1 // -> "aaa"
null || "hoge" // -> "hoge"

TODO余裕あったら練習問題作る