if (value == true) は無意味じゃないよ
◆ Boolean? とか演算子オーバーライドとかゆるく比較されるとか
ネットで見かけた書き込みで if (value == true) という謎なコードがあった というのがありました
Java などの強い型付け言語だと 型が異なる変数は比較自体できないので true と比較できるのは Boolean 型だからわざわざ true と比較する必要はありません
ですが 意味のある場合もあります
例えば C# だと Boolean? 型という Nullable な型があります
true/false/null のいずれかですが true の場合のみというときは value == true としないとエラーになります
Boolean と Boolean? は別の型なので if 文の中に Boolean? 型はおけません
また C++ などの == 演算子をオーバーライドできる言語だと true と比較するのは Boolean 型以外の型の場合もあり定義した独自の比較処理が行われます
JavaScript などの弱い型付け言語だと == はキャストして型を合わせて比較という演算子になります
JavaScript では if の中に Boolean 型以外を入れると Boolean 関数に入れた結果で判定され true と == 比較したものとは別の結果です
↑は true と比較せず if 文の中に直接書けば全部表示されます
という感じで if (value == true) という書き方は言語によってはちゃんと意味があるんです
Java などの強い型付け言語だと 型が異なる変数は比較自体できないので true と比較できるのは Boolean 型だからわざわざ true と比較する必要はありません
ですが 意味のある場合もあります
例えば C# だと Boolean? 型という Nullable な型があります
true/false/null のいずれかですが true の場合のみというときは value == true としないとエラーになります
Boolean と Boolean? は別の型なので if 文の中に Boolean? 型はおけません
Boolean? b = true;
if (b == true) Console.WriteLine("This is shown.");
if (b) Console.WriteLine("Exception");
// Cannot implicitly convert type 'bool?' to 'bool'.
if (b == true) Console.WriteLine("This is shown.");
if (b) Console.WriteLine("Exception");
// Cannot implicitly convert type 'bool?' to 'bool'.
また C++ などの == 演算子をオーバーライドできる言語だと true と比較するのは Boolean 型以外の型の場合もあり定義した独自の比較処理が行われます
JavaScript などの弱い型付け言語だと == はキャストして型を合わせて比較という演算子になります
JavaScript では if の中に Boolean 型以外を入れると Boolean 関数に入れた結果で判定され true と == 比較したものとは別の結果です
if (1 == true) console.log("This is shown.")
if (2 == true) console.log("This is not shown.")
if ([] == true) console.log("This is not shown.")
if ({} == true) console.log("This is not shown.")
if ("0" == true) console.log("This is not shown.")
if (2 == true) console.log("This is not shown.")
if ([] == true) console.log("This is not shown.")
if ({} == true) console.log("This is not shown.")
if ("0" == true) console.log("This is not shown.")
↑は true と比較せず if 文の中に直接書けば全部表示されます
という感じで if (value == true) という書き方は言語によってはちゃんと意味があるんです
COMMENT
コメント一覧 (4)
-
- 2017/10/31 21:40
-
C#の場合その比較はC#6で導入されたnull条件演算子によって使いでが出てきましたね。
単にnullableな変数ならば HasValue ですみますが、null条件演算子が入ってきたときに
if (some?.Options?.IsHoge == true)
とシンプルにかけるのが良いです。
null 合体演算子を使って
if (some?.Options?.IsHoge ?? false)
とする手もありますが、判定条件の場合は見た目的にbool値比較のほうが綺麗かなと思います。
代入値の式ならばnull合体演算子のほうが合うとおもいますが。
C#5までのころは、bool値を比較式に記述するのはなんというか拙い感じがしてすごく嫌だったんですけど、言語仕様の進化とともにだいぶ感覚もかわってきますね。
(とはいえ、自分で書くなら今でも純粋なbool型なら比較は書きませんけども)
-
- 2017/11/04 00:24
-
> if (some?.Options?.IsHoge ?? false)
こんな書き方もできますね
こっちは全然書いた覚えないです
> 純粋なbool型なら比較は書きませんけども
はい 純粋な bool 型にはあえて == true を書きたくないですね
-
- 2018/01/31 17:16
-
この記事を読んで少し気になって質問します。
JavaScript の説明ですが、
例の if ( 2 == true ) のように、リテラルを比較することはあまりないと思います。
使うとしたら、
function hogehoge() { }
if ( hogehoge() == true )
{
console.log('trueです。');
}
上記のように、関数の戻り値や変数との比較だと思います。
https://developer.mozilla.org/ja/docs/Glossary/Truthy
https://developer.mozilla.org/ja/docs/Glossary/Falsy
JavaScript での Boolean の扱い方についてです。
関数の戻り値も変数もどのような値が入っているのかプログラマーなら
大体の場合予測できると思います。
JavaScript ではなく PHPの話になりますが、
http://php.net/manual/ja/function.strpos.php
文字列検索の strpos を例にします。
strpos('s', 'string');
かんたんに説明すると、
1番目引数の文字列が2番目の文字列に含まれているのかを確認する関数です。
含まれていた場合は、その文字列の位置を返し、含まれてない場合は false を返します。
結果、文字列 's' は 文字列 'string' の最初に位置するので0を返します。
これを、if ( value == true ) の観点から見ると、
if ( strpos('s', 'string') == true )
{ // 文字列出力
echo '含まれている';
}
確かに含まれているにも関わらず
strpos の結果は 0であるため、
if ( 0 == true ) になり、文字列は出力されません。
正しい使い方は、
if ( strpos('s', 'string') !== false ) です。
仕方なく比較するとしたら、== != よりは === !== の方がいいと思います。
結論は、if ( value == true ) はあまり意味のないソースだと思います。
JavaScript の場合も、if ( hogehoge() ) だけでできると思います。
比較する必要があれば、=== を使った方がいいと思います。
以上ですが、他に if ( value == true ) を使う意味はありますか?
-
- 2018/02/02 17:51
-
基本的に匿名さんの書いてるとおりであってると思います
出来る限り === による厳密な比較を行うべきでしょう
私が言いたかったことは
「if(value == true)」は「if(value)」と一緒ではなく異なる意味がある
ということであり
便利だからこっちを使ったほうが良い
ということではないです
コメントの感じから察するに匿名さんであれば理解されてるでしょうしあえていうまでもないとは思いますが
「if(value == true)」 を見かけたら無条件にとりあえず全部「if(value)」に修正して良い ということではないです
それを作った人が 1, "1", true また toString, valueOf によってそれらになるオブジェクト (右の式は true になる ({toString(){return 1}}) == true) の場合のみ実行したい意図で if 文を書いていたなら動かなくなります
== 1 なら見なくはないのですが == true となるとめったにないでしょうけどね