Javascriptの真偽判定
いつもifの条件判定で、
true/falseの結果を忘れてしまうので、
メモとして残す目的で、徒然なるままに継ぎ足してゆく。
変数を表すものとしては、var x と置く
var x = 下の表における値を代入
if(x){
console.log(true);
} else {
console.log(false);
}
※上記のif文のxに下記のValueを入れた時に、その結果をBoolean列に表示
| Value | Boolean | Description |
|---|---|---|
| 1 | true | Boolean プリミティブ |
| 0 | false | Boolean プリミティブ |
| -0 | false | Boolean プリミティブ |
| '' | false | Boolean プリミティブ |
| "" | false | Boolean プリミティブ |
| '0' | true | Boolean プリミティブ |
| 'aaa' | true | Boolean プリミティブ |
| 'false' | true | Boolean プリミティブ |
| null | false | Boolean プリミティブ |
| 'undefined' | true | Boolean プリミティブ |
| undefined | false | Boolean プリミティブ |
| NaN | false | Boolean プリミティブ |
| [].length | false | length == 0 |
| [] | true | オブジェクト自体はあるからtrue |
| {} | true | オブジェクト自体はあるからtrue |
| Object.keys({}).length | false | length == 0 |
| new Boolean(false) | true | Boolean オブジェクト |
| Boolean(new Boolean(false)) | true | Boolean オブジェクト |
※注意点としては
・Booleanオブジェクトを論理値ではない値から論理値への変換に使うと想定しない挙動になる。
・代わりにBoolean関数を使ったり、二重否定演算子を使用したりすることで回避する。
var x = Boolean(val); // 推奨
var x = !!(val); // 推奨
var x = new Boolean(val); // 使わない
階層の深いオブジェクトの真偽判定でハマるポイント
頭の中では以下のオブジェクトのように思い描いて、
「よし!zzzの値は、aaa.xxx.yyyと指定すれば、値を取り出せるぞー!」
と思ったとしても、
{
aaa: {
xxx: {
yyy: zzz
}
},
bbb: ccc
}
この場合に、実際のオブジェクトが持っている値自体が
以下のようになってしまっていると、
(xxxのプロパティ自体が存在していない状態)
{
aaa: undefined
bbb: ccc
}
xxxがそもそもundefinedまたはnullなので、
aaa.xxx.yyy と指定しても、
Cannot read property yyy of undefined
と怒られてしまう。。。
ちゃんとxxxが定義されて、値を持っているかを確認することが大切。
ちなみに、aaaがundefinedであることを判定したい場合は、
if(typeof aaa == 'undefined'){
// 処理内容
}
みたいな形で判定ができる。