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

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

ただいまの
回答率

91.05%

  • JavaScript

    13273questions

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

javascriptでいう「オブジェクト」は直接javascriptが操作できるすべてのものでしょうか?

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 307

yamagata_user

score 31

例えば

document.body.appendChild(div);


document.body.appendChild("div");


は間違った書き方でエラーになりますが、

a = createElement("div");
document.body.appendChild(a);

は正しい書き方です。

これはjavascriptのプロパティはオブジェクトしか参照できず(div)とか("div")はオブジェクトではないのでjavascriptが解釈することは不可能で、createElement("div")ならHTMLDOMでnodeと呼ばれているDOMオブジェクトなのでjavascriptが理解できるためappendChildで正常に処理されるということなのかなと思ったのですが、これって適切な解釈でしょうか。
それとなのですが、結局プロパティと呼ばれるものはすべてがjavascriptオブジェクトでしょうか。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • Lhankor_Mhy

    2017/12/18 16:56

    まだ回答を求めている、とのことですが、質問に対してはすでに回答が示されているように見えます。未解決の疑問を明示してください。

    キャンセル

  • yamagata_user

    2017/12/18 21:57

    あ、すみません。”回答を求めている”にしないと知らないうちにクローズされてコメントできなくなるのかと思って”回答を求めている”にしただけです。いただいたコメントをよく読んで一通り理解してから閉じさせていただきたいと思ったので。。

    キャンセル

回答 3

checkベストアンサー

+6

いいえ, 違います. 
JavaScriptの文法HTMLDOMとしての作法をごっちゃにしています.

プログラムが正しく動作するには次の3つのステップを通過する必要があります.

  1. プログラム言語(例えばJavaScript)の文法として正しいこと
  2. 利用しているAPI(例えばHTMLDOM)の使い方が適切であること
  3. 自分意図としたとおりにプログラムが動作すること

この視点で眺めると, 

document.body.appendChild(div);
document.body.appendChild("div");


これらのコードはJavaScriptの文法下では正しいコードです.

ですが, HTMLDOMの使い方としては, 前者は「変数divに格納されているものがElementでなかった場合にエラーとなる」後者は「appendChildメソッドには文字列を渡すことが出来ない」という点で問題のあるコードと言えます.


これはjavascriptのプロパティはオブジェクトしか参照できず(div)とか("div")はオブジェクトではないのでjavascriptが解釈することは不可能で、createElement("div")ならHTMLDOMでnodeと呼ばれているDOMオブジェクトなのでjavascriptが理解できるためappendChildで正常に処理されるということなのかなと思ったのですが、これって適切な解釈でしょうか。

もっとシンプルに,
「全てのメソッド・ファンクション・プロパティには受け入れ可能なデータの型がある. もしおかしな型が渡されると(これ以上コードを実行できないと判断し)エラーを発生する.」
と考えて下さい. JavaScriptとして実行できている以上JavaScriptはコードの内容を理解出来ています. しかし, それを実行した際にHTMLDOMとして間違った使い方をしているのでエラーが発生しているのです.

それとなのですが、結局プロパティと呼ばれるものはすべてがjavascriptオブジェクトでしょうか。

プロパティは(オブジェクトに結びついた)変数の一種ですから, 「すべてがjavascriptオブジェクト」と言うには語弊があります. 基本的に何が入っているかは場合によりけりです.

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/12 21:52

    ご回答ありがとうございます。
    私は最近javascriptの学習をしていて、javascriptはjavascriptオブジェクト(その一部がDOMでnodeと呼ばれているもの)しか解釈できないと統一的に考えていたのですが、これは誤りでしょうか。
    例えばdivタグをjavascriptメソッドに引数として渡したいとか、innerHTMLなどのプロパティが参照できるようにしたいと思ったときにはそのままの形では不可能で、creatELEMENTプロパティなどを使ってnode化(オブジェクト化)する必要があると考えていたのですが、これは不適切でしょうか。
    でも今気づきましたがそう考えるとcreateELEMENTで参照するものはオブジェクトではないということになり矛盾してしまいます。
    また、プロパティはオブジェクトを参照する存在ではないかと思っていたのですが、あるプロパティがオブジェクトかどうかはどのように判断されているのでしょうか。

    キャンセル

  • 2017/12/12 22:15

    JavaScriptの学習にはきちんとした参考書を用意して下さい. もしくは
    https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide
    等の信頼のおける出典元の記事を元に学習を進めて下さい. 決してWEBブログなどの筆者の偏見が入り込みやすい海千山千のソースを鵜呑みにするのはやめて下さいね. (いろいろ理解が追いつかないかもしれませんが, 誰でも最初はそんなものです)

    > javascriptはjavascriptオブジェクト(その一部がDOMでnodeと呼ばれているもの)しか解釈できないと統一的に考えていたのですが、これは誤りでしょうか。
    (言いたいことは判りますが)誤りです. JavaScriptが理解する”データ”にはオブジェクトの他にも「文字列」や「数値」や「真偽値」と言ったものがあるからです. (一方「DOMでnodeと呼ばれているもの」はオブジェクトの一種であり, 正解です)

    > あるプロパティがオブジェクトかどうかはどのように判断されているのでしょうか。
    それは「仕様」によります. DOM仕様であれば, そのプロパティ定義に則った値(オブジェクトや数値・文字列)が設定されています. (DOMを使うとはこの「DOM仕様を逐一憶える」ことにほかなりません)
    なお, コード上で変数はプロパティの型を判断するにはtypeof演算子やinstanceof演算子を用います.

    キャンセル

  • 2017/12/18 21:53

    ありがとうございます。
    今の私だといただいた回答を正確に理解することは困難ですが、だいぶ疑問点が解決したと思います。
    自分でもう少し回答を読み返して考え直してみたいと思います。
    このたびはありがとうございます。

    キャンセル

+4

 Object 型

JavaScript における「オブジェクト」とは、Object 型の事です。

 Node.prototype.appendChild

document.body.appendChild("div");   //  TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.

上記コードが動作しない原因は「エラーメッセージ」に書かれています。

エラーメッセージ日本語訳「型エラー: 'Node'で 'appendChild'を実行できませんでした: 第一引数は 'Node' 型ではありません」

ここでいう「'Node' 型」とは ECMAScript (JavaScriptの基本仕様)で規定される「型」の分類ではなく、広義の意味での「オブジェクトの種類」を表しており、下記リンク先で説明した「ノード」を指しています。

つまり、次の原理によって第一引数「"div"」が有効な引数ではないと扱われています。

  • 第一引数「"div"」はString型であり、Object型ではありません
  • 従って、第一引数「"div"」はノードではありません

appendChild の動作原理は次の仕様で規定されています。

上記仕様によれば、appendChild の第一引数として有効なのは「DocumentFragment, DocumentType, Element, Text, ProcessingInstruction, Comment ノード のいずれか」です。
(他にも条件がありますが、説明が複雑化する為、省略しています)

document.createElement("div") は Element インターフェースを持つ(プロトタイプチェーン上に Element.prototype を持つ)オブジェクトなので、appendChild で挿入できる、という事になります。

 プロパティ

それとなのですが、結局プロパティと呼ばれるものはすべてがjavascriptオブジェクトでしょうか。

いいえ。
「プロパティアクセス演算子で呼び出せるもの全て」がプロパティです。

var obj = {foo: 1};

console.log(obj.foo);         // 1 (プロパティ foo を呼び出している)
console.log(typeof obj.foo);  // "number" (Number 型)

 ReferenceError

a = createElement("div");  // ReferenceError: createElement is not defined
document.body.appendChild(a);


  は正しい書き方です。

いいえ。
上記コードは ReferenceError となる為、正しいコードではありません。
document.createElement("div") と書いて、正しいコードとなります。

Re: yamagata_user さん

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/12 21:40

    ご回答ありがとうございます。
    プロパティアクセス演算子とは何でしょうか?
    例では「console.log(obj.foo);」の中の変数objでしょうか。
    また、すべてのプロパティはjavascriptオブジェクトだと思ったのですが、オブジェクトではないプロパティは存在するのでしょうか。

    キャンセル

  • 2017/12/12 22:35

    プロパティアクセス演算子とは、obj.fooのような書式のことで、下記URLで定義されています。
    http://www2u.biglobe.ne.jp/~oz-07ams/2002/ecma262r3/11_Expressions.html#section-11.2.1
    obj.fooを例に取るなら、オブジェクトobjがプロパティfooを持つことになるわけですが、プロパティfooの値はObject型とは限りません…ということを親記事のコードで説明しています。

    キャンセル

  • 2017/12/17 22:47

    a = createElement("div");はイコールのすぐ後にdocumentが必要でした。ご指摘ありがとうございます。
    リンク先のwebサイトを拝見したのですが私がどこまで理解できたのか不明なのですがobj.fooで例えばdocument.innerHTMLの場合、プロパティinnerHTMLはdocumentオブジェクトが直接操作しているのでjavascriptオブジェクトだと思ったのですが、逆にプロパティfooがObject型ではないケースというのはどのような場合なのでしょうか。

    キャンセル

  • 2017/12/17 23:12

    document.innerHTML は定義されていませんし、innerHTML プロパティの返り値は常に String 型ですね。

    > プロパティfooがObject型ではないケース
    2017/12/12 22:35のコメントでも書きましたが、親記事の例がそれです。
    var obj = {foo: 1};
    において、プロパティ foo は Number 型であり、Object 型ではありません。

    キャンセル

  • 2017/12/18 21:50

    もう一度いただいた回答を読み返して考えてみたいと思います。
    このたびは大変詳しく教えてくださり本当にありがとうございました。

    キャンセル

+1

私は趣味でC++やっています。
なので、間違っている部分もありますが。


まず、用語はきちんと把握しているでしょうか?

なんか、プロパティが Javaとかでいう オブジェクトとかインスタンスに相当するものに読み取れます。

もしそういう意味で使っているなら間違いです。

JavaScriptでの プロパティは C++でいえば メンバ変数, JavaやC#だとフィールド に相当するものです。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Working_with_Objects

で、あくまで可能性ですが、

C++やJavaなどのような型が厳格な言語だと

整数の引数を一個受け取る関数のときはそれ以外のデータ( 文字列, クラスオブジェクト, 構造体オブジェクト... ) を入れるとエラーになります。

そういうものでは?

型が違うとかが原因っていう。

JavaScriptは型がない言語らしいので、完全にこれではないですが、

それに近い感じかなと。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/10 14:00

    > メソッドは含みません。

    参考として貼られているリンク先に
    「簡単に言えば、オブジェクトのプロパティのうち関数であるものがメソッドです。」
    と書いてあるのですが。

    キャンセル

  • 2017/12/10 14:18

    raccyさん。
    ありがとうございます。
    言われて、びっくりして再チェックしたところ,
    確かに書いてありますね...
    JavaScriptはあまり使い慣れていないので...
    編集します。

    キャンセル

  • 2017/12/18 21:54

    ありがとうございます。
    C++でも類似した概念があったとは全く知りませんでした。
    また時間のある時にいただいた回答を読み返させていただきたいと思います。

    キャンセル

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

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

関連した質問

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

  • JavaScript

    13273questions

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