🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

4回答

1114閲覧

jsにおける「 || 」論理和演算子について簡単にどういうものなのか、教えてください

o_0

総合スコア7

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/10/19 08:52

編集2019/10/19 09:02

### 演算子について、

演算子とは )個人的な解釈↓
簡単に言えば「記号を使った演算を求める方法」って考えてもいいのでしょうか。。。

また、とあるソースコードをネットで見つけて独学していくうちに、
「 || 」という論理和演算子にたどり着きました。

イメージ説明

そもそも演算子と一言で言ってもその演算子には大きく分けて5つもの種類があるそうです

1:算術演算子
2:ビット演算子
3:論理演算子
4:比較演算子
5:代入演算子

その中でも特に 1算術、4比較、5代入、はベースみたいなもので、
主に結構な頻度で利用されていることがわかりました。

しかし2のビット演算子や3の論理演算子に関しては
基礎知識で独学していって今初めて目にした物で驚きと好奇心を隠せません。

本題に入ります。

 || 論理和 とは

論理演算子に依存する「 || 論理和」は、
=**「 二つの値の論理和を求める( 一方または両方がtrueならtrue )」**
とのこと、
ではここで言われる「二つの値」とは一体どこのことなんでしょうか。
また
論理和を簡単にいい表すならどういう意味なのでしょうか。
ウィキペディア

以下のコードではどんな動作をしているのでしょうか。
どこと関連しているのか、

js

1var daaf = daaf || {}; 2 3// 「 || 」 は演算子の一つで、「論理演算子」として使われる。 4// || = 論理和 = 2つの値の論理和を求める(一方、または両方がtrueならtrue)。 5 6 7/*「二つの値の論理和を求める」、 この 「二つの値」 とはどこのことでしょうか。。*/ 8 9 10daaf.cbit = { 11 12init:function(){ 13 this.setP(); 14 this.Event(); 15 }, 16 17// ・・・処理・・・ 18 19} 20 21 22$(function(){ 23 daaf.cbit.init(); 24});

僭越ながら教えていただけませんでしょうか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

||

|| は「左項」「右項」のいずれかを返す二項演算子です。

JavaScript

1console.log( A || B );
  • 「左項(A)」が truthy -> 「左項(A)」を返す
  • 「左項(A)」が falsy -> 「右項(B)」を返す

truthy, falsy

  • truthy -> Boolean形に変換して true に変換される値の性質
  • falsy -> Boolean形に変換して false に変換される値の性質

Boolean形への変換は ToBoolean で行われますが、コードで試す上では Boolean() と同等です。

Re: o_0 さん

投稿2019/10/19 09:49

編集2019/10/20 12:36
think49

総合スコア18189

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

演算子は数学の記号と同じものと思って頂いてよいと思います。(+とか-とか)

挙げられているサンプルがちょっと特殊な使い方で、数学とは違ってプログラミング言語で昔から書かれている作法みたいなものです。

|| 演算子の左側がTrueだと右側の値にTrue,Falseどちらが来ても||演算子が生成する値はTrueとなるので左側がTrueの時は右側は見なくてよい(右側の値は計算しなくてよい)という性質を利用して
処理をショートカットする時にこのような書き方をします。

var daaf = daaf || {};

これを評価(計算)すると
daafに何か値が入っている場合(nullでない場合)はその値を返し、daafに代入
値が入っていない場合(nullの時)は{}(中身が空っぽのオブジェクト)が生成されdaafに代入
という動作になります。

プログラミング言語の制御構造で同じことが書けますが、
var tmp;
if(daaf == null)
tmp = {};
else
tmp = daaf;

daaf = tmp;

みたいに書くと長くなるので、1行で書きたい時に使う書き方です。

数学の論理演算の話と計算機が現実に行う計算の話がごっちゃになっているので
これ何?という印象になるのかと思います。

投稿2019/10/19 09:34

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

o_0

2019/10/19 11:34

ほぁあ、なるほどです。 || は、 左側が真の時 右側の値に真,偽どちらが来ても"論理和演算子が生成する値は(真)となる"ので! 右側は見なくてよい。 どちらにしろ真じゃん!でも 左が偽なら、 右側の空っぽの値を?daafに返す。でいいのでしょうか   daaf || {};  この場合は、 daafに値やデータが入っているから、その値を返し、daaf(変数?)に代入!で daafに値が入っていない場合は{}(中身が空っぽのオブジェクト)が生成されdaafに代入! daafにデータが入っているか入っていないか(処理が出来てるか出来てないか)は、 次の行の daaf.cbit = {・・・処理内容・・・}でわかる、ってことでいいのでしょうか。 わかりやすい解説と、 >if文みたいに書くと長くなるので、1行で書きたい時に使う という理由、そして >数学の論理演算の話と計算機が現実に行う計算の話がごっちゃになっているので これ何?という印象になるのかと思います。 など 質問主がなぜ疑問に思ったのか その理由までも把握配慮してくれたあなたに深く感謝します。 ベストアンサーです
退会済みユーザー

退会済みユーザー

2019/10/19 12:42

完全に理解されているかと思います。 現実のプログラムとして 関数A:処理結果としてTrueもしくはFalseを返す。但し処理に5秒かかるとする 関数B:処理結果としてTrueもしくはFalseを返す。但し処理に10秒かかるとする 関数Aと関数Bの処理結果を||した結果(||した値がTrue or False)を求めたい時に 関数A || 関数B と書いて正直に計算すると15秒かかるのを5秒で済ませられるようにプログラミング言語が作ってある、と思うと理由がイメージしやすいかもしれません。 分かりにくくしている要因がもうひとつあって、他の方々が詳しく書いて下さっている通りですがJavaScriptはTrue,Falseとみなす範囲が広くて例えば変数の場合ですと、条件式に変数だけ書くとその変数が差している値が nullの場合: Falseとみなす。但しみなすだけで、値自体はnull null以外:の場合Trueとみなす。但しみなすだけで、値はその変数の値 となるので var a = 1; var b = 2; var result = a || b; →resultには1が入っている var a = null; var b = 2; var result = a || b; →resultには2が入っている となります。数字の箇所をdaaf と {} に置き換えてもらえばご理解頂けるかと思います。
o_0

2019/10/19 15:58 編集

そうですよね! daaf.cbit = { ・・・処理・・・ }; var a = daaf;  //daafは変数Aにとっての中身のある”値”である) var b = {};   // {} は変数BにとってのFalseで”null値”である)値自体はnull var result = a || b; //{ A or B }( 仮にBにデータがあった場合でもAが偽でない限りA参照 ) result = a 論理和 || がここでどれだけ重要な役割をはたしているか 実感することができました! お陰さまでまた一歩前進です。
退会済みユーザー

退会済みユーザー

2019/10/20 09:27

もしかして誤解されているかもと思ったのでちょっとだけ・・(誤解されてなかったらすみません) var b = {};   // {} は変数BにとってのFalseで”null値”である)値自体はnull JavaScript固有の話になるんですが、"null" と "{} "(空っぽのオブジェクト)は別物です。 ・nullは変数を宣言したのだけど、「この変数はどこも指してないよ」という状態を表したい時に使います。 ・{}は実際のオブジェクトを生成するよ、という意味です。中身は空っぽなんですけど実際のJavaScriptオブジェクトは見た目空っぽでもかなりの量の情報を保持していてます。誰も住んでいない家(見た目空っぽ)でも家自体にはかなり大きな物体といえばいいでしょうか・・。 ですので、 var b = {}; ←この1行を実行すると、オブジェクトがメモリに確保されて使える状態になります。 また、条件式の中では null:Falseとみなされる {}:Trueとみなされます。(ここ誤解されているのではないかなと危惧しています) まとめですが、 var daaf = daaf || {}; この1行がやりたいことは、これ以降daafという変数を使って何かやるけどdaaf変数がメモリに確保されているオブジェクトを指していない状態(nullの場合)に処理を行うと困ったことになるので(例外が発生してプログラムが止まる)、 nullであるならば{}というオブジェクトを生成して以降、そのオブジェクトを使って処理をするということです。
think49

2019/10/20 13:20 編集

@Genon さん > null以外:の場合Trueとみなす。但しみなすだけで、値はその変数の値 これは誤りです。 +0.-0,NaN,'' 等、falsy な値は他にもあります。 詳細は私の回答のリンク先を参照下さい。 @o_0 さん ベストアンサーに選んだ @Genon さんの回答のみを参考にして理解に努めようとしているように見受けられますが、頂いた回答全てに目を通して、総合的に判断する方が得るものが大きいのではないかと思います。
退会済みユーザー

退会済みユーザー

2019/10/20 13:02

think49さん、ご指摘ありがとうございます。 他にもあることは承知しているのですが、網羅すると話が発散しそうだったので、今回のケースに絞って書いた次第です。 失礼しました。
think49

2019/10/20 13:31

@Genon さん そういうことでしたか。 横から拝見する限りでは「中身のある値」と「null値」の2つの性質しかない、と解釈されているように読めてしまいましたので、横入りしていました。 「全てのObject型」が truthy であるという認識も持っていないのではと…。 (個人的には、「型」の違いが認識できていない気がします)
think49

2019/10/20 13:32

@Genon さんが退会しているのは、私が原因なのでしょうか…。
o_0

2019/10/21 09:20

think49さんが原因で大会したわけではないと思いますよw 原因として挙げるなら、誤解をしている私でしょうしw 私の誤解にGenonさんは指摘してくれていますし、 ここだけに限って大会したわけではないと思いますよw なのでthink49さんは気にしなくても。。。 すくなくても「誰が悪い!」ということではないかと。 Genonさん!ありがとうございました。
think49

2019/10/22 01:35

@o_0 さん フォローありがとうございます。 しかし、私のアドバイスは耳に届かなかったようですね。 露骨な差別は(私だけでなく)回答者の心象を悪くするでしょう。
guest

0

論理演算子に依存する「 || 論理和」は、

=「 二つの値の論理和を求める( 一方または両方がtrueならtrue )」
とのこと、
ではここで言われる「二つの値」とは一体どこのことなんでしょうか。

数値演算の+は、「二つの値の算術和を求める」ですが、これはわかりますよね?
その「二つの値」と同じことです。

var daaf = daaf || {};

daaf{}の論理和です。
daafが「真の値」なら、演算結果はdaafの値。
daafが「偽の値」なら、演算結果は{}となります。

これをifで書き直すと、

JavaScript

1var daaf; 2if(daaf) { 3 daaf = daaf; 4} else { 5 daaf = {}; 6}

です。
JavaScriptにおいて、「真の値」とはなにか、「偽の値」とは何かについては、別途学んでください。

論理演算は、中学校で学びますので、全く覚えていなければ、「中学数学を学びなおす」的な書籍が確か出てたので、そういう本で復習するとよいかと思います。

投稿2019/10/19 09:26

otn

総合スコア85882

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「||」論理演算子は、TrueかFalseだけを返すわけではありません。(Javascriptの場合で、言語によって異なる場合があります。)

var daaf = daaf || {};

の場合は、daaf || {}において、
左側「daaf」がTRUE(真)の場合は(値が入っている場合など)、daafがそのまま変数に代入されそこで処理が終わります。
左側「daaf」がFALSE(偽)の場合は、右側の{}が返り値となり、daafに{}が代入されます。

投稿2019/10/19 09:46

編集2019/10/19 09:48
ryuii

総合スコア438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問