いろいろな値からBooleanへの変換の規則

if文の条件式など、論理値を必要とされる場所にいろいろな型の値を入れたときにどう評価されるかについて、プログラミング言語別メモ。

まとめ

  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

C言語 / C++

NULL, 0, 0.0, '\x00'false の扱いになり、それ以外は true の扱いになる。

空文字列 "" は、true になる。

Go言語 (golang)

if文やwhile文などの条件式にはbool型以外を置くことはできない。置こうとしてもコンパイルエラーになる。

Java / Scala

if文やwhile文などの条件式にはboolean型(ScalaはBoolean型)とjava.lang.Boolean型以外を置くことはできない。置こうとしてもコンパイルエラーになる。

PHP

false, null, 0, 0.0, '', '0', array()false の扱いになり、それ以外は true の扱いになる。文字列 '0'false だが、文字列 '0.0'true になる。

true, false, null は大文字小文字の区別がない。

Python

False, None, [], (), {}, "", 0, 0L, 0.0, 0jFalse の扱いになる。その他に nonzero()len() メソッドがあるオブジェクトで False0 を返すものも False の扱いになる。それ以外は True になる。

Ruby / JRuby

false, nil のみは false の扱いになり、それ以外はすべて true の扱いになる。

他の言語と違い、0''[]true

Perl

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

false, 0, '', null, undefined, NaNfalse の扱いになり、それ以外は true になる。[]{}true になる。

条件式に置いた場合ではなく、 truefalse と比較するとまたルールが違う。

以下は自分の環境での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
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。