概要
JavaScriptの論理演算や変数の存在チェックについて
説明しなくても何となく見ればわかるかもしれないがあまり見ない書き方だったのでまとめる
JavaScript勉強シリーズ
- JavaScriptのthisについてメモ
- JavaScriptのコンストラクタについて
- JavaScriptのwindowについてのメモ
- JavaScriptのプロトタイプ継承について
- JavaScriptのプロトタイプチェーンについてメモ
- JavaScriptのスコープについてメモ
- JavaScriptの論理演算による存在チェックについて
- 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 || expr2 |
|
参考
-
[JavaScriptの「&&」「 」について盛大に勘違いをしていた件](http://qiita.com/Imamotty/items/bc659569239379dded55) - 論理演算子
コメントを書く
コメント一覧