JavaScript
メモ書き

JavaScriptの論理値・論理否定

More than 3 years have passed since last update.

言語ごとに論理値が異なるのでバックエンドとフロントエンドを触っているとたまに「あれ?」となるのでとりあえずメモ書きとしてJavaScriptの論理値を調べてみました。

実行したコード

var a;
var a;
var vals = {
    'Boolean(true):' : true,
    'Boolean(false):' : false,
    '数値(0):' : 0,
    '数値(1):' : 1,
    '数値(NaN(非数値)):' : NaN,
    '数値(正の0と負の0):' : +0 === -0,
    '数値(0とnull):' : 0 == null,
    '文字列(0):' : '0',
    '文字列(1):' : '1',
    '空の文字列:' : '',
    '半角スペース:' : ' ',
    'NULL:' : null,
    'undefined:' : undefined,
    '未定義の変数:' : a,
    'a == null:' : a == null,
    'a === null:' : a === null,
    'a == undefined:' : a === undefined,
    '空の配列:' : [],
    '空のオブジェクト:' : {},
    '値を返さない関数:' : (function(){return;})(),
    '0を返す関数:' : (function(){return 0;})(),
    '1を返す関数:' : (function(){return 1;})(),
    '関数オブジェクト:' : function(){return;},
    '1970/01/01(UTC):' : new Date('1 January 1970 00:00:00 UTC'),
    '1970/01/01:' : new Date('1 January 1970 00:00:00'),
    '無効な日付:' : new Date('あ'),
    '1970/01/01(UTC)(getTime()):' : new Date('1 January 1970 00:00:00 UTC').getTime(),
    '1970/01/01(getTime()):' : new Date('1 January 1970 00:00:00').getTime(),
    '無効な日付(getTime()):' : new Date('あ').getTime(),
};

for(var key in vals){
    console.log(
        '|' + key + '|' + (vals[key] ? '**true**' : 'false') + '|' +
        (!vals[key] ? '**true**' : 'false') + '||'
        );
}

結果

|Boolean(true):|**true**|false||
|Boolean(false):|false|**true**||
|数値(0):|false|**true**||
|数値(1):|**true**|false||
|数値(NaN(非数値)):|false|**true**||
|数値(正の0と負の0):|**true**|false||
|数値(0とnull):|false|**true**||
|文字列(0):|**true**|false||
|文字列(1):|**true**|false||
|空の文字列:|false|**true**||
|半角スペース:|**true**|false||
|NULL:|false|**true**||
|undefined:|false|**true**||
|未定義の変数:|false|**true**||
|a == null:|**true**|false||
|a === null:|false|**true**||
|a == undefined:|**true**|false||
|空の配列:|**true**|false||
|空のオブジェクト:|**true**|false||
|値を返さない関数:|false|**true**||
|0を返す関数:|false|**true**||
|1を返す関数:|**true**|false||
|関数オブジェクト:|**true**|false||
|1970/01/01(UTC):|**true**|false||
|1970/01/01:|**true**|false||
|無効な日付:|**true**|false||
|1970/01/01(UTC)(getTime()):|false|**true**||
|1970/01/01(getTime()):|**true**|false||
|無効な日付(getTime()):|false|**true**||

見にくいので表にします

調べた値 論理値 論理否定「!」 備考
Boolean(true): true false
Boolean(false): false true
数値(0): false true
数値(1): true false
数値(NaN(非数値)): false true
数値(正の0と負の0): true false MDNには「JavaScript では、正のゼロと負のゼロが区別されます」と書いてあるのが
数値(0とnull): false true CやC++と異なり、nullは0と等価ではありません
文字列(0): true false
文字列(1): true false
空の文字列: false true
半角スペース: true false
NULL: false true
undefined: false true
未定義の変数: false true
a == null: true false 未定義の変数(a)との比較
a === null: false true 未定義の変数(a)との比較
a == undefined: true false 未定義の変数(a)との比較
空の配列: true false
空のオブジェクト: true false
値を返さない関数: false true
0を返す関数: false true
1を返す関数: true false
関数オブジェクト: true false
1970/01/01(UTC): true false
1970/01/01: true false
無効な日付: true false
1970/01/01(UTC)(getTime()): false true
1970/01/01(getTime()): true false
無効な日付(getTime()): false true

論理否定の「!」は比較演算子の「!==」と同じようです。