JavaScriptの論理値・論理否定

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

実行したコード

```js
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') + '||'
        );
}
```

結果

```text
|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](https://msdn.microsoft.com/ja-jp/library/ie/7wkd9z69%28v=vs.94%29.aspx)には「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**||

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