JavaScriptの論理演算による存在チェックについて

■ 目次

  1. 概要
  2. 変数の存在チェック
  3. プロパティの存在チェック
  4. 論理演算まとめ
  5. 参考

■ 概要

JavaScriptの論理演算や変数の存在チェックについて
説明しなくても何となく見ればわかるかもしれないがあまり見ない書き方だったのでまとめる

JavaScript勉強シリーズ

■ 変数の存在チェックについて

宣言していない変数を使おうとするとReferenceErrorが起きる

print(a); // Exception: ReferenceError: Can't find variable: a

var a = 1;
print(a); // 1

これを回避する方法として以下の書き方を使うことができる

// 変数aに既に値が入っていればそれを使い、入っていないなら3を代入する
var a = a || 3;
print(3); // 3

// 2行目でaに3を入れているのでbには3が入る
var b = a || 5;
print(b); // 3

実際に何をやっているかというと2行目の変数aの値が0や”(空文字)などブーリアン型に変換されて偽になる値ならば右項の3が戻されて代入される

それを確かめるための例

// ||の左項をブーリアン型に変換して真になるなら左項を評価する
print(1 || 3); // 1
print(3 || 0); // 3

// 左項が真の場合に右項は評価されない
var x = 0;
print(3 || (x = 1)); // 3
print(x);            // 0

// 左項が偽の場合に右項が評価される
print(0 || 7); // 7

応用例として関数に引数を渡さなかった時のデフォルトを指定することができる

function test(a_val) {
  var a = a_val || 7;
  print(a);
}

test();  // 7
test(3); // 3

■ プロパティの存在チェック

存在しないプロパティにアクセスしてもエラーにはならないでundefined値が返るので注意

var x = {};
print(x.y); // undefined

// undefined値のプロパティにアクセスするとTypeErrorになる
print(x.y.z); //Exception: TypeError: 'undefined' is not an object (evaluating 'x.y.z')

undefined値のプロパティにアクセスしないためのイディオム

var x = {};
print (x.y);         // undefined
print (x.y.z);       // Exception: TypeError: 'undefined' is not an object (evaluating 'x.y.z')
// x.yが偽だった左項を評価するだけ
print(x.y && x.y.z); // undefined

var x = {y:{z:1}}
print (x.y);         // [object Object]
print (x.y.z);       // 1
// x.yが真だったため右項を評価する
print(x.y && x.y.z); // 1

■ 論理演算まとめ

expr1 && expr2
  • expr1が偽の場合はexpr1を返す
  • そうでない場合はexpr2を返す
  • 右項左項trueならば&&はtrueを返しそうでないならfalseを返す
expr1 || expr2
  • expr1が真の場合はexpr1を返す
  • そうでない場合はexpr2を返す
  • 右項左項どちらかがtrueならば||はtrueを返し両方ともfalseならばfalseを返す

■ 参考


Be First to Comment

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です