今まであいまいだった「比較演算子を使わない条件式」での、 true
/ false
の判定パターンについて学んだことをまとめる。
「ノンプログラマのためのJavaScript はじめの一歩」 第2章 JavaScriptの文法 より
比較演算子を使わない条件式とは
条件式には文字列や数値を指定することもできる。
例えば、次の2つの条件式はどちらも true
になる。
1つめのような条件式は2つめの書き方に置き換えられる。
var name = 'Doc';
// 比較演算子を使った条件式
if (name !== '') { ... }
// 比較演算子を使わない条件式
if (name) { ... }
どうしてこのような記述ができるのか。
それは条件式に比較演算子がなかった(文字列や数値が入っている)場合、それを true
/ false
のどちらかに判定する仕様になっているから。
比較演算子を使わない場合の true / false 判定
「データがない」とみなされる値は false
、それ以外が true
となる。
false とみなされる 「データがない」 値とは
次の変数 a
〜 e
を条件式に入れると false
になる。
var a = 0; // 「数値」の0
var b = 0/0; // 数値として扱うことができない(NaN)
var c = ''; // 「文字列」の空
var d = null; // 値が存在しない(null)
var e; // 値が定義されていない(undefined)
空の「配列」や「オブジェクト」は true
になる。
(個人的にひっかかりそうだったので書いておく)
試してみたこと
true
/ false
の判定基準や null
と undefined
の違いをわかっているようで若干ぼんやりしていたので、いくつかのパターンでどのような結果になるか試してみた。
空の配列を使った条件式
var dog = [];
if (dog) { ... } //-> true
// 条件式に入っているのが 「空の配列」 なので true
if (dog[0]) { ... } //-> false
// 条件式に入っているのが 「配列0番目の値 (定義されていない)」 なので false
falseになる値とデータ型
var dog = {
name: '',
age: null
};
console.log(dog.name); //-> 空
typeof dog.name; //-> string
// データ型が string と定義されている
// 値は空 (空の文字列)
console.log(dog.age) //-> null
typeof dog.age; //-> object
// データ型は object と定義されている
// 値が入っていない (null)
console.log(dog.breed); //-> undefined
typeof dog.breed; //-> undefined
// 値が定義されていない (undefined)
まとめ
どんな値がどちらに判定されるのかは、 false
とみなされる値のパターンを覚えておけばよさそう。
値が false
に含まれるかどうかは、 console.log
と typeof
で値とデータ型を確認することで判断できそう。