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

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

ただいまの
回答率

90.52%

  • JavaScript

    16421questions

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

Javascript-if({}) { について

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 509

yu_ouo

score 6

最近Javascriptの勉強を始めた初心者です。
以下の処理について分からないことがあります。(とある問題にて)

if({}) {
    console.log("true")
} else {
    console.log("false")
}


・if({})がif(new Object())ということまでは分かったのですが、
ここでなぜオブジェクトを生成することがtrueになるのかが分かりません。
・また、なぜif(!null)でもtrueが表示されるのかが分かりません。
・if(!0)でtrueが表示されるのは型変換され、if(0=falseじゃない)→if(true)になるのでtrueが表示される考え方でよろしいでしょうか。

今までJavaをやってきたのでifの中がboolean型ではない状態に混乱しています。どなたか教えていただけませんか。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2017/03/12 23:31

    質問文のコードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。

    キャンセル

  • yu_ouo

    2017/03/12 23:37

    ご指摘ありがとうございます。

    キャンセル

回答 3

+7

 ToBoolean 演算子

if 文の () 内は ToBoolean 演算子によって Boolean 型に変換される仕組みになっており、下記ページに変換表があります。

ES2016 では ToBoolean 演算子 で true と評価されるのは次の5種類です。

  • Boolean 型 (true のみ)
  • Number 型 (+0-0NaN 以外)
  • String 型 (空文字 "" 以外)
  • Symbol 型
  • Object 型

 ! 演算子

! 演算子は ToBoolean 演算子で Boolean 型に変換後、truefalse を反転させます。
http://www.ecma-international.org/ecma-262/7.0/#sec-logical-not-operator

Re: yu_ouo さん

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/13 22:00

    リンクまで貼り付けていただきありがとうございます。

    キャンセル

+3

論理値への変換は「何故か」といわれてしまうと難しいですが、0 NaN 空文字列 null undefind false 以外が true になる、というような感じでしょうか。

【文法とデータ型 - JavaScript | MDN】
https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Grammar_and_types#Data_structures_and_types


追記:

引用先の内容が適切でないため下記リンクを外しました。

【論理値 | JavaScript プログラミング解説】
http://so-zou.jp/web-app/tech/programming/javascript/grammar/data-type/boolean/

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/13 01:14

    > 0 NaN 空文字列 null undefind 以外が true になる
    至極当然なので抜けてしまったのだと思いますが、false が抜けてますね…。

    キャンセル

  • 2017/03/13 01:15

    指摘ありがとうございます!修正しておきます。

    キャンセル

  • 2017/03/13 01:26

    http://so-zou.jp/web-app/tech/programming/javascript/grammar/data-type/boolean/ の解説にもやもやします…。
    [論理値への変換] -> [変換の基準] において、
    - [変換前の型] に [配列], [関数] が入っていて、それらが型の名前であるかのように説明されている
    - [オブジェクト], [関数], [配列] の [変換後の値] が「nullとundefind 以外」とあって、Object 型の中に null, undefined があるかのように説明されている
    いろいろと独自解釈があるようで仕様に忠実な解説ではない印象です。

    キャンセル

  • 2017/03/13 01:40

    そうですね、リンクを切っておきます。(コメントでも触れているのでURLはそのまま置いておきます)

    キャンセル

  • 2017/03/13 22:03

    「論理値への変換」という仕組みがあるのですね、初めて知りました。

    キャンセル

checkベストアンサー

+1

if (条件式)、for (;条件式 ;)、!(条件式) など条件式を書くべき所で、boolean型でないと、boolean型へ(すなわちtrueまたはfalse)へ以下の規則で自動変換されます。

undefined false
null false
0 false
0以外の数 true
非数(NaN) false
0文字の文字列("") false
1文字以上の文字列 true
配列 true
オブジェクト true

if({})

オブジェクトだから、trueですね。

if(!null)

if(!null)→if(!false)→if(true) になります。

if(!0)

if(!0)→if(!false)→if(true) ですね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/13 22:00

    とても分かりやすい回答ありがとうございます。

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • JavaScript

    16421questions

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