質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

Q&A

解決済

3回答

1202閲覧

javascriptにおける、if文の()内の挙動について。

porie

総合スコア6

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

0グッド

1クリップ

投稿2020/10/10 18:35

前提・実現したいこと

検証環境:repl.itのNode.js環境(Node.js v12.16.1)

javascriptのif分の挙動についてご質問があります。
以下の2つの記述では実行される結果が違うのですが、その理由を知りたいです。

ソースコード

javascript

1 if ( false === a[0] && true ){ 2 console.log("test") 3} 4//ReferenceError: a is not defined

これは理解できます。aを定義していないので、test文字列は出力されません。
そこで、以下のようなif文も試しました。

javascript

1 if ( false && true === a[0] && true ){ 2 console.log("test") 3} 4//(何も出力されない)

この場合、なぜ、ReferenceError: a is not definedとならないのでしょうか?
false && trueの評価は、falseであるため、false === a[0]&&true を比較したif文と結果は同じかと予想しておりましたが違っていました。

大変お手数ですが、こちらの理由をご教授いただけますと幸いです。

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

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

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

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

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

guest

回答3

0

false && true === a[0] && trueの最初、falseの評価直後にfalse && true === a[0] && true全体の評価結果はfalseに決まります。
a[0]は(そしてtrue === a[0]trueも)評価されません。
短絡評価と言います。

投稿2020/10/10 19:06

shinji709

総合スコア805

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

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

porie

2020/10/13 03:01

短絡評価について理解が深まり、今回の謎が解けました。 有難うございます!
guest

0

ベストアンサー

論理演算子 - JavaScript | MDN

をご覧になればよくわかるかと。

勘違いされているのは、&&演算子は、論理値を返すわけではないということです。

上記ページにもある通り、&&演算子は、
左項がtrueになる場合、右項を評価するため、
今回の、false && true === a[0]は、
まずは左項がfalseのため、
右項の評価に移ることはなくfalseとなります。
つまり、その最右項の&& trueも評価されませんので、
式全体がfalseとなり、
if文内は実行されません。

そして、先述した、論理値を返すわけではないに関しては、下記を実行すればわかるでしょう。

javascript

1const a = 1 && 25; 2console.log(a); // 25 3 4const b = 0 && 1; 5console.log(b); // 0

となる通り、左項がになる場合は、右項を返す、
左項がになる場合は、左項を返すのが、
&&演算子です。
それをうまく使うのが、両方が真である場合という条件を設定できるわけです。
その事を踏まえれば、今回の結果になることは理解できるかと思います。

というわけで、なぜ、
ReferenceError: a is not defined
が出ないのかというと、
そもそも、true === a[0]が評価されない(実行されない)からです。

投稿2020/10/10 19:07

編集2020/10/11 00:47
miyabi_takatsuk

総合スコア9528

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

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

porie

2020/10/13 03:00

&&演算子の返す値についてそもそも誤解しておりました。 加えて、短絡評価についても失念しておりお恥ずかしい限りです。 大変わかりやすかったです。ありがとうございました。
guest

0

false && true === a[0] && true

この質問を要約すると
「お前a変数が定義されているか否かなんて、静的解析時にわかるやろ、なんでエラーにならへんのや」
って事ですよね?

JSは現在のスコープに定義された変数が無ければ、
上のスコープに遡って取りに行きます。
最後はグローバル変数スコープまで探しに行きます。

それすらも何とかなるやろと思うかもしれませんが、
JavaScriptはブラウザ上でHTML文書とセットで動作する都合上、
上に追加したスクリプトタグでグローバル変数をいくらでも定義出来るわけです。

なので実行してみなければその変数があるかないかはわかりません。


ぽんとfalse && true === a[0] && trueを渡されても実行されるまではわからないわけです。
実際下記のようにすればエラーは出ません

js

1var a = [true]; 2// 新しい変数スコープを作る為に即時実行関数を使う 3(() => { 4 if (true === a[0] && true) { 5 console.log(a); 6 } 7})(); 8// [true]が表示されて正常終了

AND演算子は他の方が解説されているように、
左辺を評価して、trueっぽい値でなければ右辺は実行しません。

投稿2020/10/12 04:15

編集2020/10/12 04:19
miyabi-sun

総合スコア21158

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

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

porie

2020/10/13 06:25

ご回答ありがとうございます。 なるほど、「実行されるまでは存在がわからない」という点、とても腑に落ちました。 今回は短絡評価と&&演算子の挙動について誤解していたことが主因でしたが、大変勉強になりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問