以下の内容はhttps://var.blog.jp/archives/72877369.htmlより取得しました。
COMMENT
コメント一覧 (4)
1. ななしさん
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型なら比較は書きませんけども)
2. [管理人]
2017/11/04 00:24
> if (some?.Options?.IsHoge ?? false)
こんな書き方もできますね
こっちは全然書いた覚えないです
> 純粋なbool型なら比較は書きませんけども
はい 純粋な bool 型にはあえて == true を書きたくないですね
3. 匿名さん
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 ) を使う意味はありますか?
4. [管理人]
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 となるとめったにないでしょうけどね