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

Published: 2016年3月20日 by tomsato

概要

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を返す

参考

  • [JavaScriptの「&&」「   」について盛大に勘違いをしていた件](http://qiita.com/Imamotty/items/bc659569239379dded55)
  • 論理演算子

Share

最近の投稿

NetlifyのSplit TestingとFunctionsについて使い方をまとめる Split TestingはGitHubのブランチをベースにしたA/Bテストを行うための機能のことで、FunctionsはNetlifyでAWS Lambdaを使うことができる

NetlifyとはHTMLなどの静的コンテンツのみで構成されたWebサイトを閲覧できる形で配信するWebサービス GitHubやBitbucket、GitLabなどと連携して使うことができて、リポジトリにプッシュすることで自動でCI/CDを行うことができる、無料枠が豊富で独自ドメインを設定可能

WordPressからJekyll(GitHub Pages)に移行した手順をまとめる。 お金的な事情や使いやすさなどの理由で無料のJekyll+GitHub Pagesに移行した。JekyllとはMarkdown等から静的ページを生成する静的サイトジェネレータ

Scala開発のためにScalaらしさをまとめる 言語設計者の設計思想を元にScalaらしさについてまとめる オブジェクト指向と関数型の融合について

StorybookとはUI開発環境を提供するツール React、React Native、Angular、Vueなどをサポートしている ユーザーは独立した開発環境でコンポーネントを個別に作成して挙動の確認をテストできたり、コンポーネントを一覧にしてカタログ化できるので他の人に紹介する時に使えたりする

カテゴリ一覧

タグ一覧