<?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>JavaScript  |  React入門</title>
	<atom:link href="https://react-js.jp/tag/javascript/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>JavaScript  |  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>
		<item>
		<title>モダンJavaScriptの変数宣言(let, const)</title>
		<link>https://react-js.jp/let-const</link>
					<comments>https://react-js.jp/let-const#respond</comments>
		
		<dc:creator><![CDATA[りあぴ]]></dc:creator>
		<pubDate>Thu, 08 Dec 2022 07:39:22 +0000</pubDate>
				<category><![CDATA[React]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[モダンJavaScript]]></category>
		<category><![CDATA[変数]]></category>
		<guid isPermaLink="false">https://react-js.jp/?p=46</guid>

					<description><![CDATA[近年、いわゆるモダンJavaScriptと呼ばれるものは2015年に改定されたES6(ES2015)以降を指していることが多いようです。そこで特に大きく変わったのが変数宣言です。 目次 これまでのJavaScriptの変 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>近年、いわゆるモダンJavaScriptと呼ばれるものは2015年に改定されたES6(ES2015)以降を指していることが多いようです。<br>そこで特に大きく変わったのが変数宣言です。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">これまでのJavaScriptの変数宣言</a><ol><ol><li><a href="#toc2" tabindex="0">var で変数宣言する問題点</a><ol><ol><li><a href="#toc3" tabindex="0">・内容を上書きできてしまう</a></li><li><a href="#toc4" tabindex="0">・すでに宣言されていても宣言できてしまう</a></li></ol></li></ol></li></ol></li></ol></li><li><a href="#toc5" tabindex="0">モダンJavaScriptの変数宣言</a><ol><ol><li><a href="#toc6" tabindex="0">letを使った変数宣言</a></li><li><a href="#toc7" tabindex="0">const を使った変数宣言</a></li></ol></li></ol></li><li><a href="#toc8" tabindex="0">constの注意点</a><ol><ol><li><a href="#toc9" tabindex="0">constで配列を宣言して内容を上書きする例</a><ol><ol><li><a href="#toc10" tabindex="0">constで宣言された配列要素の内容を書き換える例</a></li><li><a href="#toc11" tabindex="0">constで宣言された配列に要素を追加する例</a></li><li><a href="#toc12" tabindex="0">constでオブジェクトを宣言して内容を上書きする例</a></li></ol></li></ol></li></ol></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">これまでのJavaScriptの変数宣言</span></h2>



<p>これまでJavaScriptで変数を宣言する時は var を使っていました。<br>var での宣言には問題があり、バグが出やすくなるため現在ではほぼ使われていません。</p>



<h4><span id="toc2">var で変数宣言する問題点</span></h4>



<h6><span id="toc3">・内容を上書きできてしまう</span></h6>



<pre class="wp-block-code javascript"><code>var a = 1;
a = 2; // 内容を上書き

console.log(a); // 2が表示される</code></pre>



<h6><span id="toc4">・すでに宣言されていても宣言できてしまう</span></h6>



<pre class="wp-block-code javascript"><code>var b = 1;<br>var b = 2; // エラーにならない</code></pre>



<p>これらの特徴はコードが小さいうちは良いのですが、大きくなってくるにつれてバグを生み出しやすくなってしまいます。</p>



<p>そこで現在のJavaScriptでは var の代わりに ES6(ES2015) から導入された <span class="red">let</span> と <span class="red">const</span> が使われるようになりました。</p>



<h2><span id="toc5">モダンJavaScriptの変数宣言</span></h2>



<h4><span id="toc6">letを使った変数宣言</span></h4>



<p>letは内容を上書きできるので、ほぼvarと同じように使うことができます。</p>



<pre class="wp-block-code javascript"><code>let a = 1;
a = 2; // 内容を上書き

console.log(a); // 2が表示される</code></pre>



<p>ただし var と違って再宣言しようとするとエラーになります。</p>



<pre class="wp-block-code javascript"><code>let b = 1;<br>let b = 2; // エラーになる</code></pre>



<h4><span id="toc7">const を使った変数宣言</span></h4>



<p>constで変数を宣言すると、内容を上書きできません。<br>もちろん再宣言もできません。</p>



<pre class="wp-block-code javascript"><code>const a = 1;<br>a = 2; // エラーになる</code></pre>



<p>これらの特徴によって、var で変数宣言するよりも比較的安全になるので、現在では let と const で変数を宣言することが標準的になっています。</p>



<h2><span id="toc8">constの注意点</span></h2>



<p>constで宣言した変数は内容を上書きできないと言いましたが、実は種類によっては上書きできてしまうケースがあります。<br>それが配列とオブジェクトです。</p>



<h4><span id="toc9">constで配列を宣言して内容を上書きする例</span></h4>



<h6><span id="toc10">constで宣言された配列要素の内容を書き換える例</span></h6>



<pre class="wp-block-code javascript"><code>const array = &#91;'x', 'y', 'z']; // 配列を宣言
array&#91;2] = 'a'; // 最後の要素の中身を書き換える
console.log(array);
&#91;'x', 'y', 'a'] // 内容が書き換わっている</code></pre>



<h6><span id="toc11">constで宣言された配列に要素を追加する例</span></h6>



<pre class="wp-block-code javascript"><code>array.push('b');<br>console.log(array);<br>&#91;'x', 'y', 'a', 'b'] // 要素が追加されている</code></pre>



<h6><span id="toc12">constでオブジェクトを宣言して内容を上書きする例</span></h6>



<p>まずは const でオブジェクトを宣言します。</p>



<pre class="wp-block-code javascript"><code>const obj = {
  a: 1,
  b: 2
}</code></pre>



<p>constで宣言されたオブジェクトのプロパティを変更してみます。</p>



<pre class="wp-block-code javascript"><code>obj.b = 5;
console.log(obj);
{ a:1, b:5 }</code></pre>



<p>プロパティの中身を書き換えてしまうことができました。<br>さらに新しいプロパティを追加してみます。</p>



<pre class="wp-block-code javascript"><code>obj.c = 3;<br>console.log(obj);<br>{ a:1, b:5, c:3 }</code></pre>



<p>このように新しいプロパティを追加することもできます。</p>



<pre class="wp-block-code javascript"><code>delete obj.b; // プロパティを削除

console.log(obj);
{ a:1, c:3 }</code></pre>



<p>プロパティの削除もできます。</p>



<p>しかし以下のように Object.freeze を使うことでオブジェクトの内容を変更できないようにすることもできます。</p>



<pre class="wp-block-code javascript"><code>const obj2 = {
  a: 1,
  b: 2
};
Object.freeze(obj2); // オブジェクトを凍結

obj2.a = 3; //エラーが出るわけではない
obj2.b = 4; //同上

console.log(obj2);
{ a:1, b:2 } // 上書きする前の値のままになっている</code></pre>



<p>ただし Object.freeze を使っても<span class="bold-red">孫プロパティは変更できてしまう</span>ので注意が必要です。</p>



<pre class="wp-block-code javascript"><code>const obj3 = {
  a: 1,
  b: 2,
  c: {
    d: 3
  }
};
Object.freeze(obj3);

obj3.c.d = 9; // 孫プロパティdの内容を上書き

console.log(obj3);
{ a:1, b:2, c:{ d:9 } } // freezeしたのに上書きできてしまう</code></pre>



<p>以上のようにオブジェクトの場合は const でも中身を書き換えることができるので、Reactでオブジェクトを宣言する場合には基本的に const を使うのが良さそうです。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://react-js.jp/let-const/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>仮想DOMとは</title>
		<link>https://react-js.jp/virtual-dom</link>
					<comments>https://react-js.jp/virtual-dom#respond</comments>
		
		<dc:creator><![CDATA[りあぴ]]></dc:creator>
		<pubDate>Thu, 08 Dec 2022 03:09:29 +0000</pubDate>
				<category><![CDATA[React]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[仮想DOM]]></category>
		<guid isPermaLink="false">https://react-js.jp/?p=36</guid>

					<description><![CDATA[目次 モダンJavaScript以前仮想DOMで高速化 モダンJavaScript以前 従来のJavaScriptでは以下のようにしてDOM(Document Object Model)の操作、つまり画面の更新をしていま [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">モダンJavaScript以前</a></li><li><a href="#toc2" tabindex="0">仮想DOMで高速化</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">モダンJavaScript以前</span></h2>



<p>従来のJavaScriptでは以下のようにしてDOM(Document Object Model)の操作、つまり画面の更新をしていました。<br>以下のコードはブラウザの開発コンソールでもそのまま実行できます。</p>



<pre class="wp-block-code javascript"><code>var elm = document.createElement('div'); //div要素を生成
var text = document.createTextNode('Hello!'); //テキストノード生成
elm.appendChild(text); // divの子要素にテキストノードを設定
document.body.appendChild(elm); // body要素の末尾にdiv要素を追加</code></pre>



<p>上のコード例は生のJavaScriptによるやや冗長な書き方で、jQueryなどのライブラリを使えばもっと簡潔に書けますが、内部的な処理としてはいずれも同様になります。<br>実行結果は以下のようになります。</p>



<pre class="wp-block-code html"><code>&lt;html>
&lt;body>
...
&lt;div>Hello&lt;/div>
&lt;/body></code></pre>



<p>しかし、この方法はレンダリングに時間がかかるため、Webアプリケーションで頻繁に行うと重くなってしまいます。<br>また、システムが大きくなるにつれ、JavaScriptのコードの見通しが悪くなりがちになってしまう問題がありました。</p>



<h2><span id="toc2">仮想DOMで高速化</span></h2>



<p>そういった問題を解決するのが仮想DOMという技術で、ReactやVue、Angularなどの、モダンなJavaScriptフレームワークで使われています。</p>



<p>仮想DOMは、実際のWebページを表す<span class="bold-green">DOMとは別に</span>、React内部でJavaScriptオブジェクトのデータ構造として扱われます。実体のDOMよりも軽量です。</p>



<p>Reactで画面を更新する際には、仮想DOMとの差分を実体のDOMに反映するようにしています。<br>それによってReactは高速に動作し、スムーズな画面の更新を実現しています。</p>



<p>少し難しそうに思えるかもしれませんが、Reactが内部で自動的にやってくれるので、最初のうちは開発する上で仮想DOMを意識する必要はありません。そういった仕組みがあるんだくらいに知っておくと良いと思います。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://react-js.jp/virtual-dom/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
