トゥルーとフォルスとトゥルーシーとフォルシー
前置き
boolean型の値であるtrue
とfalse
というこれらの値、プログラミング初心者の方や高校で簡単なC言語だけをやった人間だとあまり必要性を感じないかもしれないので、
これらが何を表現し、なぜこれを使うのが良いのかについて解説します。
また、後半ではJavaScriptにおけるトゥルーシー、フォルシーなどと呼ばれる物についても解説します。
true
とfalse
まずはこれらの値がどんな時に発生するのかをみていきましょう。
/* (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を実行する」という様な表現が可能となるわけです。
なんでtrue
とfalse
が必要?
JS含め色々な言語でtrue
やfalse
といった値を使わずとも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どちらも真である時にこの命題は真となります。
こういったものは真偽値表というもので表され、
A | B | AかつB |
---|---|---|
False | False | False |
False | True | False |
True | False | False |
True | True | True |
同様に他二つも並べると、
A | B | AまたはB |
---|---|---|
False | False | False |
False | True | True |
True | False | True |
True | True | True |
A | Aでない |
---|---|
False | True |
True | False |
なぜこれらを紹介したかといえば、これらはJS内で表現できるからです。
- 「かつ」は「
&&
」 - 「または」は「
||
」 - 「でない」は「
!
」
をそれぞれ使います。
ただし、JS(TS)内でのこれらの演算は純粋に命題論理のそれを表すものではなく、真偽値以外の値についても扱うことに注意が必要です。これについてはのちの節でやります。
トゥルーシーとフォルシー
先ほど、JSのif文では条件式にtrue
やfalse
ではなく1
や0
といったものを使っても動くことを紹介しました。
この1
の様に、true
ではないがtrue
であるかの様に扱われる値をトゥルーシーな値、
対して0
の様にfalse
ではないがfalse
であるかの様に扱われる値をフォルシーな値などと呼びます。
トゥルーシーな値は、フォルシーな値ではない奴らのことであり、フォルシーな値の方が絶対数が少ないためこれを紹介する。
フォルシーな値の代表的な例としては、
- 数値の
0
- 空文字列
""
undefined
null
であり、トゥルーシーな値はこれらでないものほぼ全てです。
真偽値でない値と命題演算
JS(TS)において真偽値でない値が使えるのはif文などの条件式に限りません。先ほど紹介した「&&」や「||」などといった命題演算でも使用できます。
ここでかなり注意が必要なので、真偽値表をよくみてください。
A | B | A && B |
---|---|---|
フォルシー | ? | A |
トゥルーシー | ? | B |
A | B | A || B |
---|---|---|
フォルシー | ? | B |
トゥルーシー | ? | A |
A | !A |
---|---|
フォルシー | true |
トゥルーシー | false |
なぜこうなるのか、先ほどの普通の真偽値表と見比べてみましょう。
A | B | AかつB |
---|---|---|
False | False | False |
False | True | False |
True | False | False |
True | True | True |
これを見ると、AがFalseの場合必ずFalseを返しているのでこの様に簡略できます。
A | B | AかつB |
---|---|---|
False | ? | False |
True | False | False |
True | True | True |
また、AがTrueの場合にはBが結果になることがわかりますので
A | B | AかつB |
---|---|---|
False | ? | False |
True | ? | B |
この様に簡略できます。ここでさらにAがFalseの場合Aを返していると見れば
A | B | AかつB |
---|---|---|
False | ? | A |
True | ? | B |
トゥルーシーとフォルシーの心理地表と見比べましょう。
A | B | A && B |
---|---|---|
フォルシー | ? | A |
トゥルーシー | ? | B |
おんなじですね!||
に関しても似た様な簡略ができます。
この結果JSにおける命題演算は以下の様なことができます。
true && "aaa" // -> "aaa"
false && 1 // -> false
undefined && true // -> undefined
{} && [] // -> []
"aaa" || 1 // -> "aaa"
null || "hoge" // -> "hoge"
TODO余裕あったら練習問題作る