<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tips  |  React入門</title>
	<atom:link href="https://react-js.jp/tag/tips/feed" rel="self" type="application/rss+xml" />
	<link>https://react-js.jp</link>
	<description>WebアプリUI構築のためのJavaScriptライブラリ</description>
	<lastBuildDate>Mon, 12 Dec 2022 09:40:49 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.1.1</generator>

<image>
	<url>https://react-js.jp/wp-content/uploads/cropped-React_logo_logotype_emblem_512-32x32.png</url>
	<title>Tips  |  React入門</title>
	<link>https://react-js.jp</link>
	<width>32</width>
	<height>32</height>
</image> 
<atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/><atom:link rel="hub" href="https://websubhub.com/hub"/>	<item>
		<title>HTMLCollectionとNodeListの違い</title>
		<link>https://react-js.jp/htmlcollection-nodelist</link>
					<comments>https://react-js.jp/htmlcollection-nodelist#respond</comments>
		
		<dc:creator><![CDATA[りあぴ]]></dc:creator>
		<pubDate>Mon, 12 Dec 2022 09:25:19 +0000</pubDate>
				<category><![CDATA[React]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[ループ]]></category>
		<category><![CDATA[変換]]></category>
		<category><![CDATA[配列]]></category>
		<guid isPermaLink="false">https://react-js.jp/?p=53</guid>

					<description><![CDATA[JavaScriptのHTMLCollectionとNodeListは、HTML文書内の要素を表すために使用される配列のようなオブジェクトです。「配列のような」というのは、どちらもlengthプロパティを持ち、インデック [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>JavaScriptのHTMLCollectionとNodeListは、HTML文書内の要素を表すために使用される配列のようなオブジェクトです。<br>「配列のような」というのは、どちらもlengthプロパティを持ち、インデックス番号（添字）でアクセスできるためです。</p>



<p>しかし実際には配列ではなく、また、HTMLCollectionとNodeListはそれぞれ似て非なる型のオブジェクトであるため、JavaScriptで扱う際には注意が必要です。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">複数のHTML要素を取得する方法</a><ol><ol><li><a href="#toc2" tabindex="0">その1 「getElementsBy」でHTML要素を取得</a></li><li><a href="#toc3" tabindex="0">その2 「querySelectorAll」でHTML要素を取得</a></li><li><a href="#toc4" tabindex="0">getElementsByとquerySelectorAllの使い分け</a></li></ol></li></ol></li><li><a href="#toc5" tabindex="0">HTMLCollectionとNodeListの違い</a><ol><ol><li><a href="#toc6" tabindex="0">要素が増減した時の挙動</a></li><li><a href="#toc7" tabindex="0">メソッドの違い</a></li></ol></li></ol></li><li><a href="#toc8" tabindex="0">HTMLCollectionを配列のようにループさせるには？</a><ol><ol><li><a href="#toc9" tabindex="0">Array.from で配列に変換してmapでループ</a></li><li><a href="#toc10" tabindex="0">スプレッド構文[…array]で配列に変換してmapでループ</a></li></ol></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">複数のHTML要素を取得する方法</span></h2>



<p>JavaScriptでタグ名やクラス名などを指定して、複数の要素を取得する方法はいくつかあります。</p>



<h4><span id="toc2">その1 「getElementsBy」でHTML要素を取得</span></h4>



<p>JavaScriptで複数のHTML要素を取得するには、下記の方法がよく使われます。<br>これは太古の昔からある方法です。<br>かつてはIE6に対応するために、これらの方法がよく使われていました。</p>



<pre class="wp-block-code javascript"><code>document.getElementsByClassName()<br>document.getElementsByTagName()<br>document.getElementsByName()</code></pre>



<p>ここで返されるのが <span class="bold-red">HTML Collection</span> というものです。<br>ブラウザの開発コンソールで以下のように試すと HTMLCollection と表示されます。</p>



<pre class="wp-block-code javascript"><code>document.getElementsByTagName('div')<br>▶ HTMLCollection(3)&nbsp;&#91;div, div, div]</code></pre>



<p>以下のように配列と同様にインデックス番号（添字）で取り出すことができます。</p>



<pre class="wp-block-code javascript"><code>const elms = document.getElementsByTagName('div');
console.log(elms&#91;0]);
▶ &lt;div&gt;...&lt;/div&gt;</code></pre>



<h4><span id="toc3">その2 「querySelectorAll」でHTML要素を取得</span></h4>



<p>複数のHTML要素を取得する別の方法として <code><strong>querySelectorAll</strong></code> があります。<br>getElementsBy…よりも少し新しい方法です。といっても2008年頃からあります。<br>(参考) <a rel="noopener" href="https://amachang.hatenablog.com/entry/20080306/1204787459" target="_blank">IE8 で実装された Selectors API とは何か？ &#8211; IT戦記<span class="fa fa-external-link external-icon anchor-icon"></span></a></p>



<p>これはCSSセレクタと同じ書き方で要素を取得できて便利です。</p>



<pre class="wp-block-code javascript"><code>document.querySelectorAll('div')<br>▶ NodeList(3)&nbsp;&#91;div, div, div]</code></pre>



<p><span class="bold-red">getElementsByで取得した時と違って NodeList と表示されています</span>。<br>こちらもインデックス番号（添字）でアクセスできるのは同じです。</p>



<pre class="wp-block-code javascript"><code>const elms = document.querySelectorAll('div');
console.log(elms&#91;0]);
▶ &lt;div&gt;...&lt;/div&gt;</code></pre>



<h4><span id="toc4">getElementsByとquerySelectorAllの使い分け</span></h4>



<p>querySelectorAllの方が便利で使いやすいですが、速度面ではgetElementsByの方が速いので、特に大量に要素がある場合などは、要素の指定が単純なもの（クラス名やタグ名など）はgetElementsByで取得して、指定が複雑なものはquerySelectorAllで取得するのが良いと思います。</p>



<h2><span id="toc5">HTMLCollectionとNodeListの違い</span></h2>



<p>では HTMLCollectionとNodeListの違いは何でしょうか？大きく2つの違いがあります。</p>



<ul>
<li>要素が増減した時の挙動</li>



<li>メソッドの違い</li>
</ul>



<h4><span id="toc6">要素が増減した時の挙動</span></h4>



<p>HTMLCollectionは後から要素の数が増減すると、動的に反映されます。<br>ライブオブジェクトと呼ばれる性質のオブジェクトです。</p>



<p>NodeListは要素の数が変わっても、後からそれが反映されません。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p>※より正確には「querySelectorAllで取得したNodeList」はライブオブジェクトではありません。<br>Node.childNodesでもNodeListを取得できますが、そちらはライブオブジェクトになります。</p>
</div>



<h4><span id="toc7">メソッドの違い</span></h4>



<p>ブラウザの開発コンソールでNodeListのprototypeを展開するとわかりますが、NodeListにはforEachメソッドがありますが、HTML Collectionにはありません。</p>



<pre class="wp-block-code"><code>document.querySelectorAll('div')
▼ NodeList &#91;main]
	▶0: div
	length: 1
	▼ &#91;&#91;Prototype]]: NodeList
		▶entries: ƒ entries()
		▶<span class="bold-red">forEach: ƒ forEach()</span>
		▶item: ƒ item()
		▶keys: ƒ keys()
		　length: (...)
		▶values: ƒ values()
		▶constructor: ƒ NodeList()
		▶Symbol(Symbol.iterator): ƒ values()
		　Symbol(Symbol.toStringTag): "NodeList"
		▶get length: ƒ length()
		▶&#91;&#91;Prototype]]: Object
</code></pre>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p>※以前はNodeListにもforEachメソッドがありませんでしたが、Chrome 51(2016年)で追加されたようです (参考) <a rel="noopener" href="https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach#browser_compatibility" target="_blank">NodeList.prototype.forEach() &#8211; Web APIs | MDN<span class="fa fa-external-link external-icon anchor-icon"></span></a></p>
</div>



<h2><span id="toc8">HTMLCollectionを配列のようにループさせるには？</span></h2>



<p>以下はlengthプロパティを使った昔ながらのforループです。昔からある定石のような方法です。</p>



<pre class="wp-block-code javascript"><code>const elms = document.getElementsByTagName('div'); // HTMLCollection
const len = elms.length;
for (let i=0; i&lt;len; i++) {
  console.log(elms&#91;i]);
}</code></pre>



<p>ちなみにlengthをあらかじめ変数に代入しているのは、ほぼ気持ちの問題ですがループごとに要素のlengthプロパティにアクセスするよりも速そうだからです。</p>



<p>ES6（ECMAScript 2015）以降であれば（IE を対象外にすれば）、for of 文を使って簡潔に記述することもできます。※for inではなくfor <span class="red">of</span>であることに注意してください</p>



<pre class="wp-block-code javascript"><code>const elms = document.getElementsByTagName('div'); // HTMLCollection
for (const e of elms) {
  console.log(e);
}</code></pre>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p>for文の時は let i=0 だったのに、for of の時は constを使っていることに疑問を感じたかもしれません。これは for in や for of ではループごとにスコープが変わるためです。毎回違うブロックで実行されているイメージです。</p>
</div>



<p>HTML Collectionも配列に変換することで、配列と同じforEachやmapやfilterなどのメソッドが使えるようになります。</p>



<h4><span id="toc9">Array.from で配列に変換してmapでループ</span></h4>



<pre class="wp-block-code javascript"><code>const elms = document.getElementsByTagName('div'); // HTML Collection
const elmsAry = Array.from(elms); // 配列に変換
elmsAry.map( (v) =&gt; { console.log(v); } ); // 配列なのでmapでループできる</code></pre>



<p>※Array.fromはIEは非対応です</p>



<h4><span id="toc10">スプレッド構文[…array]で配列に変換してmapでループ</span></h4>



<pre class="wp-block-code javascript"><code>const elms = document.getElementsByTagName('div'); // HTML Collection
const elmsAry = &#91;...elms]; // 配列に変換
elmsAry.map( (v) =&gt; { console.log(v); } ); // 配列なのでmapでループできる</code></pre>



<p>配列と似ているので、ついうっかりmapを使おうとして「ん？」となりがちなHTMLCollectionとNodeListですが、しっかり違いを理解して、楽しく要素をループさせましょう。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://react-js.jp/htmlcollection-nodelist/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
