いろいろな値からBooleanへの変換の規則 2015/04/06
if
文の条件式など、論理値を必要とされる場所にいろいろな型の値を入れたときにどう評価されるかについて、プログラミング言語別メモ。
まとめ 2015/09/16
C言語 | PHP | Python | Ruby | Perl | JavaScript | |
0 | false | false | false | true | false | false |
0.0 | false | false | false | true | false | false |
空文字列 | true | false | false | true | false | false |
空の配列 | true | false | false | true | false | true |
- Rubyは異端児で全部true
- それ以外は原則false
- C言語の文字列と配列はポインタと似ているので中身が空であってもtrue
- JavaScriptの配列はオブジェクトであるので空であってもtrue
C言語 / C++ 2015/09/16
NULL
, 0
, 0.0
, '\x00'
は false
の扱いになり、それ以外は true
の扱いになる。
空文字列 ""
は、true
になる。
Go言語 (golang) 2015/09/16
if
文やwhile
文などの条件式にはbool
型以外を置くことはできない。置こうとしてもコンパイルエラーになる。
Java / Scala 2015/02/14
if
文やwhile
文などの条件式にはboolean
型(ScalaはBoolean
型)とjava.lang.Boolean
型以外を置くことはできない。置こうとしてもコンパイルエラーになる。
PHP 2015/04/21
false
, null
, 0
, 0.0
, ''
, '0'
, array()
は false
の扱いになり、それ以外は true
の扱いになる。文字列 '0'
は false
だが、文字列 '0.0'
は true
になる。
true
, false
, null
は大文字小文字の区別がない。
Python 2015/04/21
False
, None
, []
, ()
, {}
, ""
, 0
, 0L
, 0.0
, 0j
は
False
の扱いになる。その他に nonzero()
や len()
メソッドがあるオブジェクトで
False
や 0
を返すものも False
の扱いになる。それ以外は True
になる。
Ruby / JRuby 2015/04/21
false
, nil
のみは false
の扱いになり、それ以外はすべて true
の扱いになる。
他の言語と違い、0
も ''
も []
も true
。
Perl 2016/02/20
0
, 0.0
, '0'
, ''
, undef
, ()
は false の扱いになり、それ以外は true の扱いになる。
0.0
は false だが '0.0'
は true になることに注意。
$f = "0.0";
print "OK\n" if $f; # true
$f = "0.0" + 0;
print "OK\n" unless $f; # false
JavaScript 2015/04/21
false
, 0
, ''
, null
, undefined
, NaN
は false
の扱いになり、それ以外は true
になる。[]
も {}
も true
になる。
条件式に置いた場合ではなく、 true
や false
と比較するとまたルールが違う。
以下は自分の環境でのnodejs v0.10.15とChrome 42で確認した結果。
// 条件式に置いたときに true/false どちらになるか
// 上記説明の通り
console.log(false ? true : false); // => false
console.log("" ? true : false); // => false
console.log(0 ? true : false); // => false
console.log("0" ? true : false); // => true
console.log(null ? true : false); // => false
console.log(undefined ? true : false); // => false
console.log(NaN ? true : false); // => false
console.log([] ? true : false); // => true
// 否定の演算子
// 上の実行例と結果が反転する
console.log(! false); // => true
console.log(! ""); // => true
console.log(! 0); // => true
console.log(! "0"); // => false
console.log(! null); // => true
console.log(! undefined); // => true
console.log(! NaN); // => true
console.log(! []); // => false
// == でのfalseとの比較
// すぐ上の実行例と同じになることを期待するが、
// 全然違ってちょっとカオス
console.log(false == false); // => true
console.log("" == false); // => true
console.log(0 == false); // => true
console.log("0" == false); // => true
console.log(null == false); // => false
console.log(undefined == false); // => false
console.log(NaN == false); // => false
console.log([] == false); // => true
// "0" == false について深追いすると
console.log("0" == false); // => true
console.log("0.0" == false); // => true
console.log("0.00" == false); // => true
console.log("0x0" == false); // => true
console.log("000" == false); // => true
console.log("-0.0" == false); // => true
console.log("0.01" == false); // => false
// === での falseとの比較
// これはわかる
console.log(false === false); // => true
console.log("" === false); // => false
console.log(0 === false); // => false
console.log("0" === false); // => false
console.log(null === false); // => false
console.log(undefined === false); // => false
console.log(NaN === false); // => false
console.log([] === false); // => false
// == でのtrueとの比較
// これは全部 false になる
// == での比較はかなり幅広く曖昧なルールだが
// == true と == false と両方が false になるものがわずかだけあることになる
// さすがに両方 true になるものはなさそうだ
console.log(false == true); // => false
console.log("" == true); // => false
console.log(0 == true); // => false
console.log("0" == true); // => false
console.log(null == true); // => false
console.log(undefined == true); // => false
console.log(NaN == true); // => false
console.log([] == true); // => false
// === でのtrueとの比較
// これも当然全部 false になる
console.log(false === true); // => false
console.log("" === true); // => false
console.log(0 === true); // => false
console.log("0" === true); // => false
console.log(null === true); // => false
console.log(undefined === true); // => false
console.log(NaN === true); // => false
console.log([] === true); // => false