Edited at

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

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