🚀

【JavaScript】getElementById("") の結果に子ノードもコンソールに表示された理由をまとめてみた

に公開

疑問

以下のコードを実行した結果、コンソールに "id" が "bg" の div 要素が出力されると予想しましたが、結果は以下のようになりました。
このとき、h1 要素も一緒に出力されたことに疑問を持ちました。

なぜなら、getElementById()メソッドは、指定された単一のノードを取得するはずなのに、h1 要素も一緒に出力されたからです。

<div>
    <p id="hw">Hello World</p>
    <div id="hg">
        <h1>Have a good day!</h1>
    </div>
</div>
let ele = document.getElementById("hg");
console.log(ele);
コンソール出力結果
<div id="hg">
<h1>Have a good day!</h1>
</div>

この記事では、その理由をメモとして残していきます。

結論

「取得」と「表示」の違いによるもの

取得

document.getElementById("hg") のように、特定のメソッドで要素を取得する行為そのものは、あくまで指定されたノード1つをJavaScriptのオブジェクトとして手に入れます。このオブジェクトには、そのノードが持つすべての情報(属性、子ノードへの参照など)が含まれています。

表示

console.log() は、取得したそのオブジェクトを、開発者が見やすいように視覚化して表示する機能です。この表示の際に、オブジェクトが持っている子ノードの情報も一緒に展開して、HTMLのツリー構造として見せてくれているのです。

console.log() は、そのオブジェクトを受け取ったときに、単に「このオブジェクトは子ノードへの参照を持っています」と表示するのではなく、参照をたどって子ノードの中身も展開し、視覚的にわかりやすいHTMLツリーの形で表示するという機能を持っているようです。

解説

getElementById()は何を返すのか?

getElementById() は Document インターフェイスのメソッドで、 id プロパティが指定された文字列に一致する要素を表す Element オブジェクトを返します。
https://developer.mozilla.org/ja/docs/Web/API/Document/getElementById より引用

このメソッドによって、Elementオブジェクトが返されるようです。

このメソッドは、指定された id 属性を持つHTML要素をドキュメントの中から探し出し、その要素を返します。id はHTMLドキュメント内で一意であるべきなので、このメソッドは常に単一の要素を返します。

変数の格納

let ele = document.getElementById("hg");

このメソッドが返した要素オブジェクトは ele という変数に格納されます。
つまり、この ele という変数にはオブジェクトが格納されているということです。
この要素オブジェクトには、タグ名、属性、内容など、その要素に関するすべての情報が含まれています。

コンソールへの出力

console.log(ele) を実行すると、JavaScriptエンジンが ele に格納されている要素オブジェクトを解析し、開発者が理解しやすいようにHTML要素の形式でコンソールに表示します。

そのため、ele は単なるテキストではなく、以下のHTML要素そのものを表すオブジェクトということになります。

<div id="hg">
<h1>Have a good day!</h1>
</div>

このオブジェクトを介して、要素のテキストを変更したり、スタイルを変更したりといった操作が可能になります。

まとめ

今回は、JavaScriptを使っていく中で思った素朴な疑問をまとめてみました。
参考にしていただけましたら幸いです。

最後までお読みいただき、ありがとうございました。

参考URL

https://developer.mozilla.org/ja/docs/Web/API/Element

https://developer.mozilla.org/ja/docs/Web/API/console#コンソールへのテキストの出力

https://qiita.com/POPOPON/items/edc7a522d2ee9a50cc3a

Discussion