戻る

Javascript

目次


イントロダクション

JavaScriptとECMAScript

1995年JavaScriptはNetscape Navigator.2.0というブラウザに実装されて登場

同じころ、Microsoft社によってJScriptがInternet Explorer 3.0に実装された。

上記両者に互換性がなかったため、1997年ECMA InternationalによってECMAScriptとして標準化された。

JavaScriptとECMAScript

トップへ戻る

JavaScript開発の基礎

トップへ戻る

変数とデータ型

変数の移行

予約語

breakcasecatchclassconst
continuedebuggerdefaultdeletedo
elseexportextendsfinallyfor
functionifimportininstanceof
newretuirnsuperswitchthis
throwtrytypeofvarvoid
whilewithenum

strictモード時の予約語

strictモードはスクリプト実行時に厳しくエラーチェックするモード。

implementsletprivatepublic
yieldinterfacepackageprotected
static

現実的な命名規則

リテラル

プリミティブ型

文字列(String)

文字列定義にはシングルクォート(')、ダブルクォート(")、バッククォート(`)を使う。バッククォートで${}が使える。

数値(Number)

数値の表現形式
名称表現形式
10進数1,2,3,1010...
2進数0b11,0B11
8進数0o10,0O727
16進数0xf0a0,0X0f90

BigInt

Number型では表せない大きな範囲を表す。BigInt型とNumber型は混在できない。小数点は切り捨て。表現:1003435505n(サフィックスにnを付加)。

真偽値(Boolean)

True or False

null

nullは参照を保持していないことを表す。アドレスすら持たないことを意味する。

undefined

変数が未定義のときの値

非プリミティブ型

オブジェクトの初期化

ブラケット記法

JavaScriptのデータ型の特徴

動的型付け言語

letによる宣言、宣言時に値によって型が自動的に定まる。

静的型付け言語

宣言時に型を指定する。

型変換

明示的な型変換

型変換関数を利用

暗示的な型変換

変数が呼び出し時点に自動的に型変換される。JavaScriptは一つの分に複数のデータ型の値が含まれる場合は、型情報を統一して処理を行う。

トップへ戻る

演算子

falsyな値

false,0,-0,0n,"",null,undefined,NaN

論理演算子の挙動

トップへ戻る

制御構文

構文説明
if(条件式){}else if(条件式){}else{}条件分岐
switch(引数){case 条件式1:文1;break;case 条件式2:文2;break;}多分岐
try{throw エラー構文;}catch(エラー変数){}finally{}例外処理
while(条件式){}繰り返し構文
for(初期化処理;条件式;最終処理){}繰り返し構文
for(let 変数名 in 変数名){}繰り返し構文。列挙可能プロパティを持つオブジェクトで列挙可能性がtrueのものを繰り返すことができる。(Symbol型のプロパティは対象外)
※Arrayでは配列のindexが列挙される。
for(const 変数名 of 変数名){}繰り返し構文(反復可能オブジェクト[Array,Map,Set])
※Arrayでは配列のvalueが列挙される。
ラベル名:{break ラベル名;}ラベル構文
ラベル名:{continue ラベル名;}ラベル構文

プロパティ記述子(デスクリプタ)

トップへ

関数

構文説明
function 関数名(引数1,引数2,...){ return 戻値;}関数の定義。引数が多い場合は無視、少ない場合はundefinedとして処理される。名前が重複した場合は末尾の関数を実行。関数の実行文を定義文の前に記述できる。オブジェクトを渡す場合は参照渡しとなる。関数内で他のオブジェクトを代入すると、参照が壊れる。
const 関数名 = function(引数1,引数2,...){return 戻値;}関数式。名前が重複しているときは、エラーが発生。関数実行文を定義前に記述するとエラーとなる。
let 変数 = 関数名(引数1,引数2,...);関数の戻値を格納
関数名(引数1,引数2,...);関数を実行
var 変数名 = {function(){},function(){},function(){}…};配列に関数を定義
function 関数名(){return function(){return 値;};}戻値に関数を利用
関数名()();関数の戻値に関数が帰ってくる時、後ろの()に帰ってきた関数の引数を指定して実行
const 関数名 = new Function("引数1","引数2",...,"本文");Functionコンストラクタによる関数定義。引数や記述を文字列として記述する。
function(引数名1 = 初期値1,引数名2 = 初期値2,...){return 戻値;}デフォルト引数を設定する場合。最初の引数に値を渡さない場合はundefinedを指定する必要がある。
function(引数1,引数2,...){return 戻値;}無名関数。コールバック関数としても利用可能。
(function(引数){return 値;})(引数);無名関数をそのまま利用
() => {関数の本文;};アロー関数。無名関数の略記
引数 => {関数の本文;};引数が一つのアロー関数
(引数1,引数2,...) => {関数の本文;};引数が複数のアロー関数
(引数1,引数2,...) => 関数の本文;本文が一行のアロー関数
(引数1,引数2,...) => ({プロパティ:値1,プロパティ:値2})オブジェクトが戻値のアロー関数
arguments[インデックス]関数に渡される引数の配列、関数内部のみで利用可能。

アロー関数と無名関数の違い

キーワード無名関数アロー関数
this有無
argument有無
newインスタンス化可能インスタンス化不可能
prototype有無
トップへ戻る

スコープ

種類概要
グローバルスコープvar,関数宣言によるトップレベルスコープ。どこからでも参照可能。異なるscriptタグからも参照可能。windowオブジェクトに保持される。おそらくブラウザが切断されるまでこのスコープは保持される。
スクリプトスコープlet,constによるトップレベルスコープ。基本的にはグローバルスコープと区別せずに使える。しかしwindowオブジェクトとしては保持されない。
関数スコープ関数内で宣言された変数や関数が属するスコープ。他の関数スコープに配置された変数や関数を使うことはできない。
ブロックスコープブロック内で、letやconstで宣言された変数や関数が属するスコープ。他のスコープに配置された変数や関数を使うことはできない。
モジュールスコープESModulesが有効な時のトップレベルスコープ。scriptタグの単位でモジュールが形成されるため、他のモジュール内の変数や関数を参照できなくなる。

トップへ戻る

thisキーワード

thisを利用した場合にはwindowオブジェクトとなる。オブジェクト内で利用する場合は一つ上位のオブジェクトを指す。アロー関数の場合はthisを持たないためレキシカルスコープを参照する。コールバック関数の場合は渡された関数を定義するオブジェクト内のものとして実行するわけではないため、コールバックした関数内の要素としてthisを扱う。

実行コンテキスト

コードが実行される前にJavaScriptエンジンによって準備されるコードの実行環境のこと。どのような状態でコードが実行されるのかとういう情報が実行コンテキストごとに保持される。

実行コンテキストの種類と生成タイミング

  1. グローバルコンテキスト:HTMLのscriptタグの直下やJavaScriptファイルの直下に記述されたコードが実行される直前に実行。windowオブジェクト(グローバルオブジェクト)とthisが使用可能。
  2. 関数コンテキスト:関数が実行される直前に実行。レキシカルスコープやthisキーワード、argumentsオブジェクト、superなど特殊なキーワードが使用できる。

コールスタック

実行コンテキストの積み重ね。

thisの束縛

トップへ戻る

クラス

クラスの記法はES6から

クラスの定義

インスタンス化



クラスに関わるその他の実装

ES2022で追加された機能

プロトタイプ

JavaScriptはプロトタイプベース言語と呼ばれていて、言語使用の根底にプロトタイプという仕組みがある。→プロパティ名:prototype

  1. プロトタイプは関数オブジェクトに保持される特別なプロパティ(インスタンス化に関係)
  2. prototypeオブジェクトには関数を格納できる。(呼び出し時には通常の関数として呼び出せる、クラスに属する関数がすべて含まれる)
  3. prototypeはインスタンス化の際に__proto__にコピーされる
  4. __proto__は省略可能(代入できない)

プロトタイプチェーン

オブジェクトのプロパティや関数を参照するときオブジェクト内に当該物がない場合は__proto__を参照しに行くが、そこにもない場合はその下位にある__proto__を参照する。

プロトタイプ継承

他のオブジェクトの機能を引き継ぐことを継承、他のコンストラクタのprototypeを継承することをプロトタイプ継承という。

コンストラクタ関数

クラスとコンストラクタ関数をまとめてコンストラクタと言う場合がある。


トップへ戻る

組み込みオブジェクト

組み込みオブジェクトビルトインオブジェクト

JavaScriptエンジンにあらかじめ提供されているオブジェクト群

Windowオブジェクト

開発者がブラウザを操作するためのWeb APIが格納されている。コードを実行する前にwindowという識別子で使用可能な状態となっている。グローバルオブジェクト(グローバルオブジェクト名を省略して記述できる)。

メソッド名/構文戻値説明
setTimeout(fn,delay,arg1,arg2,...)timeoutIDfn:関数、delay:ミリ秒後実行するタスクを登録する。argで渡した引数がfnの引数。timeoutIDはclearTimeoutで使用する。
setInterval(fn,interval,arg1,arg2,...)intervalIDfn:関数、interval:ミリ秒後に実行するタスクを登録する。argで渡した引数がfnの引数。intervalIDはclearIntervalで使用する。
requestAnimationFrame(fn)requestIDfn:関数の実行を次の再描画の前に行うタスクを登録する。画面描写処理を邪魔したくないときに利用する。
queueMicrotask(fn)undefinedfn:関数をマイクロタスク(ジョブキュー)に登録する。
clearTimerout(timeoutID)undefinedtimeoutIDのタスクをキャンセルする。
clearInterval(intervalID)undefinedintervalIDのタスクをキャンセルする。
cancelAnimationFrame(requestID)undefinedrequestIDのタスクをキャンセルする
btoa(str)encodedStrstr:文字列をBase64形式のエンコード文字列(encodedStr)に変換する。
atob(encodedStr)strBase64形式のエンコード文字列(encodedStr)を文字列(str)に変換する。
alert(str)undefined文字列(str)を画面ダイアログに表示する。
confirm(str)result質問(str)と[OK]、[キャンセル]ボタンを含むダイアログを画面に表示する。OKの場合はresultにtrueが返される。
prompt(question,default)inputStrquestion:質問のテキストが入力可能なダイアログを出力する。入力欄のデフォルト値はdefaultで設定可能。入力文字(inputStr)が戻値となる。
close()undefined現在表示中のウィンドウを閉じる
open(url,windowName,windowFeatures)undefinedurlで指定したページをwindowNameで指定した画面で開く。新しい画面で開く時には、windowNameに_blankを入力する。表示位置やサイズはwindowFeaturesで指定可能。
scrollBy(x,y)
scrollBy({top:y,left:x,behavior:auto(ブラウザの判断に任せる)|instant(一瞬でスクロールする)|smooth(滑らかにスクロールする),})
undefined現在の画面左上を基準としてx,yだけスクロールする。(x,yはピクセル値)オプションを指定する時はオブジェクト形式。
scroll(x-coord,y-coord)
scrollTo(x-coord,y-coord)
scroll({top:y,left:x,behavior:auto(ブラウザの判断に任せる)|instant(一瞬でスクロールする)|smooth(滑らかにスクロールする),})
scrollTo({top:y,left:x,behavior:auto(ブラウザの判断に任せる)|instant(一瞬でスクロールする)|smooth(滑らかにスクロールする),})
HTMLの左上を基準としたx,yの指定量をスクロールする。オプションを指定する場合はオブジェクト形式
postMessage(message,targetOrigin,transfer)undefinedWindowオブジェクト間のメッセージのやり取りを行う。主にページに埋め込まれたiframeのWindowオブジェクトと親のWindowオブジェクト間でのメッセージのやり取りに使われる

Windowプロパティ

プロパティ説明
innerWidthブラウザウィンドウの内側境界線の横幅(ページの表示部分)。スクロールバーを含む
innerHeightブラウザウィンドウの内側境界線の縦幅(ページの表示部分)。スクロールバーを含む
outerWidthブラウザ自体の横幅。innerWidthと同一とも言える。
outerHeightブラウザ自体の縦幅。
pageXOffsetscrollXWebページの水平方向へのスクロール量をピクセル数で返す。
pageYOffsetscrollYWebページの垂直方向のスクロール量をピクセル数で返す。
screenLeftscreenXディスプレイの左端からブラウザウィンドウの左端までの値を返す。
screenTopscreenYディスプレイの上端からブラウザウィンドウの上端までの値を返す。
selfWindowオブジェクトのエイリアス
frameswindow内のiframeを配列風オブジェクトとして返す。(array-like)
parent現在のwindowの親のWindowオブジェクトを返す。iframeなどのさぶwindowで使用する。
topウィンドウの階層での最上位のwindowオブジェクトを返す。
undefined未定義であることを意味するUndefined型の値

章のメニューへ戻る

Dateオブジェクト

DateオブジェクトはUTCの1970/01/01/00:00からの経過時間をミリ単位で保持している

時刻表現

ISO8601日付フォーマット
フォーマット意味
YYYY年を4桁
MM0~12までの月
DD01~31までの日
T日付と時刻をTをつなげて表記
HH00~23までの時間
mm00~59までの分
ss00~59までの秒
sss1桁以上でミリ秒を表す
TZDZ:UTC,+hh:mm,-hh:mmでUTCからの相対的な経過時間を表す。UTCから-hh:mmの場所をUTC時刻の時へ戻す。
Dateオブジェクトに関するメソッド
メソッド戻値説明
値を取得するメソッド
getDate()
getUTCDate()
dateIntDateオブジェクトの日を数値で返す
getDay()
getUTCDay()
dayIntDateオブジェクトの曜日を数値で返す。0(日曜日)~6(土曜日)
getMonth()
getUTCMonth
monthIntDateオブジェクトの月を数値で返す。0(1月)~11(12月)
getFullYear()
getUTCFullYer()
yyyyDateオブジェクトの年を4桁で返す。
getyear()yearInt1900を引いた都市を2桁または3桁の数値で返す。(使用禁止されている)
getHours()
getUTCHours
hourIntDateオブジェクトの時を数値で返す。
getMinutes()
getUTCMinutes()
minuteIntDateオブジェクトの分を数値で返す。
getSeconds()
getUTCSeconds()
minuteIntDateオブジェクトの秒を数値で返す
getMilliseconds()
getUTCMilliseconds()
msIntDateオブジェクトのミリ秒を数値で返す
getTime()ms1970/01/01 00:00からの経過時間をミリ秒(ms)で取得する。
getTimezoneOffset()tzdOffset現地のタイムゾーンから見たUTC+0との時差を分単位の数値で取得
toStringdatetimeStrDateオブジェクトの日時を文字列で返す
toISOString()datetimeStrDateオブジェクトの日時をISO8601表記の文字列で返す
toJSONjsonStrDateオブジェクトをJSONで使用するために文字列に変換する。(toISOStringと同じ文字列が取得される。)
toDateString()dateStrDateオブジェクトの年月日を文字列(dateStr)で返す。
toDateString()dateStrDateオブジェクトの年月日を文字列で返す。
toTimeString()timeStrDateオブジェクトの現地時間を文字列で返す。
toLocaleString(locales,options)datetimeStrロケール(locales)、オプション(options)に合わせたDateオブジェクトの日時を文字列で返す。
toLocaleDateString(locales,options)dateStrロケール(locales)、オプション(options)に合わせたDateオブジェクトの現地時間を文字列で返す。
toLocaleTimeString(locales,options)timeStrロケール(locales)、オプション(options)に合わせたDateオブジェクトの現地時間を文字列で返す。
toUTCString()utcDatetimeStrDateオブジェクトの現地時刻をUTC時刻で表す文字列に変換する。
値を設定するメソッド
setDate(dateInt)ms(1970/01/01 00:00からの経過時間(ミリ秒))Dateオブジェクトの日を数値で設定する。月末日を超える場合には、月が1繰り上がる。0を設定すると前月の末尾が取得される。
setMonth(monthInt)
setUTCMonth(monthInt)
msDateオブジェクトの月を数値で設定する。0(1月)~11(12月)。11を超える場合には年が1繰り上がる。
setFullYear(yyyy,monthInt,dateInt)msDateオブジェクトの年、月、日を数値で設定する。
setYear(yyyy)msDateオブジェクトの年を数値で設定する。使用禁止されている。
setHours(hourInt)
setUTCHours(hourInt)
msDateオブジェクトの時を数値で設定する。23を超えるときは日が1繰り上がる。
setMinutes(minuteInt)
setUTCMinutes(minuteInt)
msDateオブジェクトの分を数値で設定する。59を超える場合には、時が1繰り上がる
setSeconds(secondInt)
setUTCSeconds(secondInt)
msDateオブジェクトの秒を数値で設定する。59を超える場合には分が1繰り上がる
setMilliseconds(msInt)
setUTCMilliseconds(msInt)
msDateオブジェクトのミリ秒を数値で設定する。999を超える場合には秒が1繰り上がる
setTime(ms)ms1970/01/01 00:00からの経過時間をミリ秒で設定する。
Dateの静的メソッド
UTC(年,月,日,時,分,秒,ミリ秒)utcDatetimeUTC時刻でDateオブジェクトを生成し返す。。
now()ms1970/01/01 00:00から現在までの経過時間をミリ秒で取得。
parse(datetimeStr)ms1970/01/01 00:00から日付フォーマット文字列の時刻までの経過時間をミリ秒で取得。

当月の月初、月末の取得

日付の差分日数を求める


章のメニューへ戻る

RegExpオブジェクト

RegExpオブジェクトの作成

正規表現にかかわるメソッド

メソッド戻値説明
test(testStr)真偽値正規表現がtestStr内で一致する場合には、trueを返す。それ以外にはfalseを返す。
exec(testStr)配列|nulltestStrから正規表現で一致した抽出結果を配列として返す。一致箇所がない場合にはnull
match(regex)配列|null文字列とregexの一致結果を配列で返す。[0]:マッチング文字列
[n]:()を使った抽出箇所が要素に追加される
[index]:一致個所の開始インデックス
[input]:入力文字(testStr)
matchAll(regex)iteratorObject文字列とregexのすべての一致箇所をイテレータとして返す。
replace(regex,replaceStr)replacedStr正規表現での一致箇所をreplaceStrで置換した文字列を返す。
search(regex)index|-1正規表現
split(separator,limit)配列文字列がseparatorによって分割された配列を返す。分割数の上限はlimitで指定可能。separatorには正規表現又は文字列を使用可能。
正規表現文字
文字説明
.改行文字以外の任意の1文字に一致する。(\n[U+000A]、\r[U+000D]、ラインセパレータ[U+2028]、段落区切り文字[U+2029]以外に一致する。
[abc][]内のいずれか1文字に一致する。
[^abc][^]内の文字以外の1文字に一致する。
[a-z]
[A-Z0-9]
上段は半角英字小文字、下段は半角英字大文字または0~9の1文字に一致する。
\w半角英数字または_のうち1文字に一致する。
\W\w以外の1文字に一致する。
\d0~9の1文字に一致する
\D\d以外の1文字に一致する
\sスペース、タブ、改ページ、改行を含むホワイトスペース1文字に一致する。(\f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff)の1文字
\S\s以外の1文字に一致する。
\n改行文字(U+000A)に一致する
\r復帰文字(キャリッジリターン)に一致する。
\tタブ(U+0009)に一致する。
\v垂直タブ(U+000Bに一致する。
^文頭一致を行う。(mフラグが有効な場合には改行文字の直後の一致も判定対象になる。)
$文末一致を表す。(mフラグが有効な場合には改行文字の直前の一致も判定対象になる)
{n}
{m,n}
{m,}
{n}直前の文字がn回繰り返す場合に一致する
{m,n}直前の文字がm回~n回繰り返す場合に一致する
{m,}直前の文字がm回以上繰り返す場合に一致する
+直前の文字1回以上の繰り返しを表す。
*直前の文字0回以上の繰り返しを表す。
?直前の文字が0回または1回繰り返す場合に一致する。(*,+,?,{}の後ろに使った場合には最短一致になる。最短一致:マッチング箇所が最短になることを言う)
(abc)()で囲んだ部分をパターンマッチ箇所として、後方参照で使用できる。後方参照とは、マッチングした箇所を後に再利用すること。
\数値:一致部分を再利用する。
$数値:一致部分を使って置換できる
配列に一致文字を格納する場合は()の箇所を後部に格納する。
ab|cde|の前後のいずれかの文字列に一致する。
\特殊文字を文字列として表す場合に使用する。
正規表現のフラグ
フラグフラグ名説明
gglobalグローバルサーチ(複数一致)を行う。
iignoreCase大文字・小文字を区別しない。
mmultiline複数行検索を行う。^を行頭一致、$を行末一致として扱う。
sdotAllドットの一致対称に改行文字を含める
uunicodeサロゲートペアに対応する完全なUnicode文字列としてパターンマッチを行う。
ystickylastIndexプロパティで示されたインデックスからの前方一致を判定する。

章のメニューへ戻る

Strageオブジェクト

Web Storage APIはlocalStorageオブジェクト(ローカルストレージ)またはsessionStorageオブジェクト(セッションストレージ)から使うことができます。これらのオブジェクトは、JavaScriptエンジンによって自動的に作成されたStorageコンストラクタのインスタンスでJavaScriptのコードを実行する前に利用可能となっている。

メソッド戻値説明
localStorageローカルストレージオブジェクト
sessionStorageセッションストレージオブジェクト
localStorage.setItem(key,value)undefinedブラウザのデータ保存領域内にkeyとvalueを対で格納する。重複するキーがすでに保存料域内に存在する場合には、値の上書きとなる。また、キーと値に仕えるデータ型は文字列。文字列以外が渡された場合には、文字列に変換されてブラウザにデータが保存される。
localStorage.getItem(key)value|nullブラウザのデータ保存領域内のkeyに一致するvalueを返す。キーが見つからない場合はnull。
localStorage.removeItem(key)undefinedブラウザのデータ保存領域内のkeyに一致するキーと値のペアを削除する。
localStorage.clear()undefinedブラウザのデータ保存領域内のすべてのキーと値のペアを削除する。
localStorage.key(index)keyNameindexを指定することでkeynameを取得する。
localStorage.lengthストレージに保存されているキーと値のペアの個数を取得する。

セッションストレージ

セッションストレージ(sessionStorage)はセッションが維持されている間に限り値が保持される。新しく開いたタブやウィンドウは異なるセッションとみなされる。ブラウザのタブやウィンドウを閉じた時点で、保存した値は自動的に消去される。


章のメニューへ戻る

JSONオブジェクト

JSON(JavaScript Object Notation)はJavaScriptのオブジェクト構造を文字列で表すときに使う表記法。JSONを利用することで、オブジェクトのデータ構造をJSON文字列(JSON形式の文字列)に変換してサーバーに送信したり、サーバから受け取ったJSON文字列をオブジェクトに変換して利用したりできる。

JSON記入時の注意事項

メソッド戻値説明
JSON.stringify(target,replacer,space)
JSON.stringify(target,["name1","name2"])
jsonStrオブジェクトをJSON文字列へ変換。replacerには["name1","name2"]のように名前を指定してJSONへ変換する部分を指定できる。replacer関数をしていすることもできる。
JSON.parse(jsonStr)object,array,number,bool,nullJSON文字列をオブジェクトに変換

章のメニューへ戻る

ラッパーオブジェクト

プリミティブ型の値の後に続けてラッパーオブジェクトのメソッドやプロパティを記述できる。また変数に代入しなければプリミティブ値はstring型とならない。プリミティブ値を利用する際はあくまでラッパーオブジェクトとして扱われる。


トップへ戻る

コレクション

配列の要素取得

記述説明
const 変数名 = [値1,値2,値3];配列定数の定義
let 変数名 = [値1,値2,値3];配列変数の定義
変数名[インデックス];配列を引用
const 配列 = new Array(length);lengthの配列を定義
const 配列 = new Array(value1,value2,...)valueの要素を持つ配列を定義
メソッド引数戻値説明
配列.push(追加したい要素1,追加したい要素2...)配列の末尾に要素を追加
配列.unshift(追加した要素1,追加したい要素2...)配列の先頭に要素を追加
配列.shift()配列の先頭の要素を削除する
配列.pop()配列の末尾の要素を削除する
配列.splice(startindex,length,addvalue1,addvalue2,...)特定の長さの分の要素を切り取る。
配列.concat(配列)別の配列を結合する
配列.concat()同一の配列を複製(ディープコピー)
配列.slice(startindex,endindex)指定範囲の配列の抽出
配列.indexOf(findvalue)index:一致要素の位置配列内で最初に一致した要素のindexを返す
配列.includes(findvalue)bool値の存在確認。
配列.join(str separate)string配列をseparate文字で区切って文字列化
配列.fill(defaultvalue,startindex,endindex)初期値を設定する。
配列.flat(dimension)多次元配列の平坦化
配列.revers()配列の要素の並びを逆にする

章のメニューへ戻る

コールバック関数を引数にとるメソッド

forEach

配列の各要素を使って繰り返し処理を行う。

実行例

//結果
101,2,3,4,5
211,2,3,4,5
321,2,3,4,5
431,2,3,4,5
541,2,3,4,5

この場合コールバック関数でthisを使うと配列を参照することになる。

map

コールバック関数の戻値を要素にとる新しい配列を返す。

filter

コールバック関数の戻値がtrueの時の配列の要素のみを配列として返す。

every

すべての要素の値が条件に一致するか

some

少なくとも一つの値が条件に一致するか

find

条件を満たした最初の要素の値を取得

sort

実行例

並び替えの方法

reduce

引数メソッドの戻値と配列の値を順次処理し、最終的な戻値を返す。


章のメニューへ戻る

静的メソッド

メソッド引数説明
Array.from(arraylike)arraylike:配列的オブジェクト配列的オブジェクトを配列として作成
Array.isArray(target)target:配列かどうか判定する変数引数を配列かどうか判定する。

分割代入


章のメニューへ戻る

Set

Setのメソッド

メソッド引数説明
変数名.add(additem)additem:追加したい要素指定した要素を追加する
変数名.delete(deleteitem)deleteitem:削除したい要素指定した要素を削除する
変数名.clear()コレクション内のすべての要素を削除する
変数名.has(searchitem)serchitem:検索する要素引数で指定した要素があるかどうか判定する。

forEach

Setプロパティ

変数.size :Setオブジェクトの要素数を返す


章のメニューへ戻る

Map

Mapのメソッド

メソッド引数説明
変数名.set(key,value)key:文字列,数値,真偽値,オブジェクトなど
value:文字列,数値,真偽値,オブジェクトなど
値を追加する
変数名.get(key)key:取得する値を示すkey値を取得する
変数名.delete(key>key:削除する値を示すkey値を削除する
変数名.clear()すべての値を削除する
変数名.has(key)key:存在を確認したい値のkey指定した値の存在を確認する

コールバック関数を引数にとるメソッド

Mapのプロパティ

変数名.size :Mapの要素数を取得


Mapからオブジェクトへ変換

const オブジェクト = Object.fromEntries(Mapオブジェクト);

Mapとオブジェクトの主な違い

WeakMap

キーにオブジェクトのみ使用可能なコレクション。

WeakMapのメソッド

メソッド引数説明
変数名.set(key,value)key:追加する値のkey
value:追加する値
値を追加する
変数名.get(key)key:取得する値のkey値を取得する
変数名.delete(key)key:削除する値のkey値を削除する
変数名.has(key)key:存在を確認する要素のkey指定したkeyが存在するか確認する

WeakMapは反復可能オブジェクトではないためfor...of文などを使った反復処理はできない


トップへ戻る

反復処理

イテレータ

反復処理の挙動を定義するときに使うオブジェクト

イテレータの特徴

※イテレーターでは関数を定義して、それを呼び出すことによって、returnで(関数のように)nextを受け取っている。関数の戻値を格納した変数では、その関数を実行した状態を格納しているようだ。変数の要素としてnextを呼び出すことで反復処理を実行することができる。関数内、next内ではコードを記述しても問題ないようであり、return文には直接はコードを記述できないようである。

反復可能オブジェクト:イテレータを保持しているオブジェクトのこと


オブジェクトにイテレータを設定する

反復可能オブジェクトを作成するには、イテレータを返す関数をオブジェクトのSymbol.iterator プロパティに設定するという決まりがある。オブジェクトにイテレータを追加した場合、for...of文のループに使用できる。ループごとに取り出される値はプロパティではなくイテレータが返す値となる。

オブジェクトに直接設定する場合
コンストラクタ関数に設定する場合(Arrayの場合)
クラスに設定する場合

ジェネレータ

ジェネレータ(ジェネレータ関数)とは、イテレータと同様の機能を持つGeneratorオブジェクトを作成するための関数。ジェネレータを使うとイテレータと同様の処理を完結に記述できる。

ジェネレータ関数の記法

ジェネレータ関数の宣言

ジェネレータ関数の関数式

ジェネレータ関数の実行

反復可能オブジェクトの作成

オブジェクトに直接設定する場合
コンストラクタ関数に設定する場合(Arrayの場合)
クラスに設定する場合

スプレッド演算子

スプレッド演算子はオブジェクトや配列の要素を展開したり、まとめたりするための演算子。オペランドの前にドットを3つつける形式で記述する。

配列の定義時に要素として利用すると、複製を行うこともできる。通常代入する場合は参照複製であるが、スプレッド演算子を利用することで、新たな配列として定義できる。

スプレッド演算子の記法

宣言時の利用
関数実行時の利用
配列の複製(コピー)に使用
配列の作成
オブジェクトでの使用(ES2018)

関数実行時にはオブジェクトをスプレッド演算子で渡すことができない。Array.prototypeにSymbol.iteratorとして関数を定義することで利用可能となる。


トップへ戻る

非同期処理

スレッド

スレッドはプログラムの開始から終了までの一連の処理の流れのこと。処理の開始から終了まで一貫していることを「1つのスレッドでコードが実行されている」と表現する。JavaScriptは基本的にシングルスレッドで実行される。(Web Workerスレッドと呼ばれる特殊な実装を行うことで利用できる並列実行もある)

イベントループ

非同期処理の管理、実行を行うための仕組み

イベントループ関連の用語

イベントループの挙動

コードの実行前にJavaScriptエンジンによってグローバルコンテキストがコールスタックに積まれる。この時点ではタスクキューは空で、Web APIも呼び出されていない状態。続いてグローバルコンテキストからWeb APIを実行することで、コールバック関数がタスクキューに実行待ちの状態で登録される。タスクキューに登録された関数はコールスタックが空になるまで実行されない。コールスタックが空になると、イベントループが検知して、コールバック関数をタスクキューから取得し関数コンテキストが生成される。その他にタスクキューにタスクが存在する場合にはイベントループによって同様に処理される。

タスクソース(task source)

タスクキューでタスクをカテゴリに分類して、ソースに応じた制御を行うためのもの

Promise

非同期処理を行うためのオブジェクト。非同期処理のネストを避けることができる。

関数意味
then()同期処理が成功したときに実行する
catch()同期処理が失敗したときに実行する
finally()非同期処理が完了した際に必ず実行する

参考となる形式

チェーンメソッド

メソッドをつなげて記述する方法。

改行を含むことも可能

Promiseチェーン

複数のPromiseを、順番に処理が完了するのを待って、次の非同期処理を実行していくこと。(直列な処理)

Promiseチェーンのイメージ

Promiseの状態管理

Promiseインスタンスは内部で現在の状態を管理し、これによってPromiseのメソッドを制御している。Promiseの状態はそのインスタンスをコンソールで出力することで確認できる。

ステータス説明
pendingresolve,rejectが呼び出される前の状態
settledfulfilledresolveが呼び出された状態
rejectedrejectが呼び出された状態

Promiseの並列処理

並列処理は静的メソッドを利用して行うことができる。

Promise.all

すべての非同期処理を並列に実行し、すべての完了を待ってから次の処理を行う。(すべてのPromiseインスタンスがfulfilledになってからthenメソッドに処理が移る。)また、いずれかのPromiseインスタンスのステータスがrejectedになったときにはcatchメソッドに処理が移る。

Promise.race

複数のPromiseインスタンスのいずれかがsettledになった時にthenメソッド(fulfilled)又はcatchメソッド(rejected)を実行する。

Promise.any

複数のPromiseインスタンスのいずれかがfulfilledになったタイミングでthenメソッドに処理を移す。すべてのインスタンスの状態がrejectedになった時はcatchメソッドを実行する。この時渡される引数は、AggregateErrorというオブジェクトになる。

Promise.allSettled

すべてのPromiseインスタンスの状態がsettledになった時にthenメソッドに移行する。allと異なりallSettledの場合はcatchメソッドは使わない。rejectとなった場合はthenメソッドのコールバック関数に、Promiseインスタンスのstatus,value or reasonが対で格納された配列が入る。

その他の静的メソッド

Promise.resolve(引数)

fulfilledの状態のPromiseインスタンスを返す。

Promise.reject(引数)

rejectedの状態のPromiseインスタンスを返す。

Promiseと他の非同期処理の違い

Promiseの非同期処理の実行は、ジョブキュー(Job Queue)によって管理されている。
ジョブキューはPromiseによる処理の管理をする専用のキュー。
Promiseによる非同期処理はマイクロタスク(Microtask)と呼ぶ。
setTimeoutやTimerはマクロタスク(Macrotask)と呼ぶ
実行順序はジョブキュー→タスクキュー

await/async

async

Promiseのthenの処理を簡潔に記述することができる。returnが返す値は必ずPromiseインスタンスになる。

await

Promiseのステータスがsettledになるまで、後続のコードの実行を待機する。

Fetch

サーバーからデータやファイルを取得するときに使う。Web APIの一種であるFetch API(Fetch関数)。非同期処理なのでPromiseやawait/asyncを使って記述する。

data
プロパティ説明
methodPOST | GET | PUT | DELETEなどのリクエストメソッドを文字列で設定する。初期値はGET
headersリクエストヘッダーを変更する時に設定する(オブジェクト形式)
bodyリクエストのbody部を挿入したい値で設定する
response
プロパティ説明
Response.ok200~299のHTTPステータスがサーバーから返された場合には、リクエスト成功としてtrueが格納されている。それ以外は、リクエスト失敗としてfalseが返る。
Response.statusHTTPステータスが格納されている
Response.headersレスポンスのヘッダー情報がオブジェクトで格納されている
メソッド説明
Response.json()レスポンスで帰ってきたJSON文字列を処理する時に使う。レスポンスをオブジェクトに変換した値をPromiseでラップしたものを取得する。
Response.blob()バイナリデータ(0と1の羅列)を含むレスポンスを処理する時に使う。動画などがこれにあたる。BlobオブジェクトをPromiseでラップしたものを取得する。
Response.text()レスポンスの文字列を取得するときに使う。文字列を扱うUSVStringオブジェクトをPromiseでラップしたものを取得する
トップへ戻る

DOM(Document Object Model)

DOM(Document Object Model)、DOMインターフェイス、DOM APIともいう。JavaScriptからHTMLへの入出力を行うことができる。

W3CがDOMやHTMLを管理してきたが、2004年にWHATWGが方向性の違いからできた。(おそらくは同一の団体)
それ以降は両者が重複する形でDOMとHTMLの仕様が管理されていた。
2019年からはWHATWGの使用に一本化することで合意されている。
HTML/DOMの仕様:WHATWG-Standards

DOMツリー

Node種別
Node説明例
ELEMENT_NODEHTMLタグ(HTML要素)の情報を保持するノード<p>,<img>等
TEXT_NODEタグ内のテキストなどの文字情報を保持するノード<p>文字列をテキストノードと言う。</p>
COMENT_NODEコメントを保持するノード<!-- コメント-->

DOMツリーの構造

ElementとNodeのツリーは、それぞれDocumentオブジェクトのchildren、childNodesに格納されている。

メソッド、プロパティ戻り値のタイプ説明
console.dir(DOMツリーのエイリアス)voidオブジェクト形式でコンソールにdocumentオブジェクトの中身を表示するメソッド
parentElementElement親のElementを返す。
parentNodeNode親のNodeを返す。
childrenHTMLCollection子のElementを含む配列風オブジェクトを返す
ChildNodesNodeList子のNodeを含む配列風オブジェクトで返す。
firstElementChildElementchildrenで取得される配列封オブジェクトの最初の要素を返す
firstChildNodechildNodesで取得される配列封オブジェクトの最初の最初の要素を返す
lastElementChildElementchildrenで取得される配列風オブジェクトの最後の要素を返す
lastChildNodechildNodesで取得される配列風オブジェクトの最後の要素を返す
previousElementSiblingElement自要素と兄弟関係にある1つ前のElementを返す
previousSiblingNode自要素と兄弟関係にある1つ前のNodeを返す
nextElementSiblingElement自要素と兄弟関係にある1つ後のElementを返す
nextSiblingNode自要素と兄弟関係にある1つ後のNodeを返す
DOMツリー外から取得可能なDOMオブジェクト
document.bodyElementHTML内の<body>のElementを返す
document.headElementHTML内の<head>のElementを返す
document.imagesHTMLCollectionHTML内の<img>のElementを含む配列風オブジェクトを返す
document.formsHTMLCollectionHTML内のすべての<form>のElementを含む配列風オブジェクトを返す
document.embedsHTMLCollectionHTML内のすべての<embed>のElementを含む配列風オブジェクトを返す
特定のElementを取得するDOMインターフェイス
getElementById("idAttr")Element|nullidの属性値(idAttr)と一致した最初のElementを取得する。一致する要素がない場合は、nullが返る。
getElementsByClassName("clsAttr")HTMLCollectionclass属性(nameAttr)を使ってElementが格納された配列風オブジェクトを取得する。一致する要素がない場合は、空のHTMLCollectionが返る。
getElementsByName("nameAttr")NodeListname属性(nameAttr)を使ってElementが格納された配列風オブジェクトを取得する。一致する要素がない場合は、空のHTMLCollectionが返る。
getElementsByTagName("tagName")HTMLCollectionタグ(tagName)を使ってElementが格納された配列風オブジェクトを取得する。一致する要素がない場合は、空のHTMLColectionが返る。
セレクタAPIによるElementの取得
querySelector(selector)Elementセレクタ文字列(selector)に一致した最初のElementを取得する
querySelectorAll(selector)NodeListセレクタ文字列(selector)に一致したすべてのElementを取得する
祖先要素にさかのぼって検索する(セレクタAPI?)
element.closest(selector)Element先祖要素を順にさかのぼってセレクタ文字列(selector)に一致するElementを返す。(elementは取得したElementオブジェクト)
要素内のコンテンツの取得・変更
innerHTML要素内のHTMLを文字列として取得、変更する。変更時にはHTMLタグは解析されて、記述通りに表示される。(Elementオブジェクトから使用可能)
textContentHTMLタグは無視された文字列として取得、変更する。(Elementオブジェクトから使用可能)
innerTexttextContentと異なり画面上に表示されるテキストのみを所有する。(Elementオブジェクトから使用可能)(非推奨)
outerTexttextContentと異なり画面上に表示されるテキストのみを所有する。(Elementオブジェクトから使用可能)(非推奨)
valueinput属性の値を取得する
contenttemplateタグがfirstElementChildで子要素を取得できないため、contentで子要素を取得する。
要素を作成・削除する
document.createElement("要素名")element要素名を指定して新しいElementを作成する
element.append(node1,node2...)element内の最後の子要素としてNodeを挿入する。Node以外に文字列も挿入可能
element.prepend(node1,node2...)element内の最初の子要素としてNodeを挿入する。Node以外に文字列も挿入可能
element.before(node1,node2...)elementの直前の要素としてNodeを挿入する。Node以外に文字列も挿入可能
element.after(node1,node2...)elementの直後の要素としてNodeを挿入する。Node以外に文字列も挿入可能
element.insertAdjacentElement(position,elementIn)要素からの相対的な位置を(position:beforebegin[element直前],afterbegin[element開始タグ直後],beforeend[element終了タグ直前],afterend[element直後])で指定してelementInを挿入。
element.insertAdjacentHTML(position,htmlStr)要素からの相対的な位置をpositionで指定してhtmlStrを挿入する。htmlStrはHTMLに解釈されて画面上に表示される。
element.insertAdjacentText(position,str)要素からの相対的な位置をpositionで指定してstrを挿入する。HTMLタグはただのテキスとして解釈される。
element.remove()自要素を削除する。
element.cloneNode(flag)elementelementを複製する。flagをtrueにすることで、子孫要素を含めることができる。
要素の属性の取得変更
getAttribute("name")属性の値を取得する。
getAttributeNames()属性名の一覧を取得する。
setAttribute("name",value)属性と値を設定する。
removeAttribute("name")属性を削除する。
toggleAttribute("name")属性の付け外しを行う。
hasAttributes()boolean属性を持っているか確認する。保持している場合にtrue、保持していない場合にfalse
hasAttribute("name")boolean特定の属性を持っているか確認する。保持している場合はtrue、保持していない場合はfalse。
位置情報を保持するElementオブジェクトのプロパティ
clientLeft
clientTop
自要素のborderの幅をpx値で返す。(読み取り専用)
offsetLeft
offsetTop
親要素の内からborder外までの幅をpx値で返す。(読み取り専用)
scrollLeft
scrollTop
コンテンツの端からパディングの端までのスクロール可能領域までのpx値。※詳細不明
大きさ情報を保持するElementオブジェクトのプロパティ
clientWidth
clientHeigth
スクロールバーを含まない、要素のパッディングまでの横幅、縦幅をpx値で取得する。(読み取り専用)
offsetWidth
offsetHeigth
要素のボーダーまでを含む横幅、縦幅をpx値で取得する。(読み取り専用)
scrollWidth
scrollHeigth
画面表示されていないスクロール可能なコンテンツ領域の横幅、縦幅をpx値で取得する。値を変更した場合は、変更したpx分スクロールされる。(読み取り専用)※詳細不明
位置や大きさを確認するためのメソッド
element.getBoundingClientRect()Object:DOMRect要素の位置と大きさを格納したオブジェクトを返す。ビューポートとborderの境界距離で計算される。
[Object{left,top,right,bottom,x,y,width,height}
style属性の変更
element.style.CSSプロパティ名elementのstyle属性の指定したプロパティを取得、変更する。
classListプロパティ(class属性の値を変更するメソッド)
element.classList.add("className")class属性にクラスを追加する。
element.classList.remove("className")class属性からクラスを削除する。
element.classList.toggle("className")クラスが設定されている場合はclass属性の値を外し、値が設定されていない場合はclass属性の値を追加する。
element.classList.contains("className")booleanclass属性内に名前が存在するかを確認する。存在する場合にtrue
window.location.assign("url",)
セレクタ文字列
セレクタ文字列説明
*すべてのタグ
Eタグ名
#idAttridの属性値
.clsAttrclassの属性値
[attr]属性名(タグに負荷するもの)
[attr="value"]属性名(attr)と属性値(value)
[attr^="value"]属性名(attr)と属性値(value)の先頭一致
[attr$="value"]属性名(attr)と属性値(value)の後方一致
[attr*="value"]属性名(attr)と属性値(value)の部分一致
S1,S2セレクタ(S1)とセレクタ(S2)に一致する(OR条件)
S1 S2セレクタ(S1)とセレクタ(S2)両方に一致する(AND条件)
S1>S2セレクタ(S1)の子要素にあたるセレクタ(S2)
S1 + S2セレクタ(S1)の直後にあるセレクタ(S2)
S1 ~ S2セレクタ(S1)の兄弟関係でS1よりも後にあるセレクタ(S2)

HTML要素が取得できない場合の対処法

  1. scriptタグを<body>の閉じタグの直前に記述する。
  2. DOMContentLoadedイベント又はloadイベント内でコードを実行する
  3. defer属性をscriptタグに付与する。(複数defer属性の付いたscriptタグがある場合は記述順)
  4. scriptタグにtype="module"を付加する。(defer属性を付加したときと同様の挙動となる)

要素の作成

  1. document.createElementメソッドを使う
  2. ダミーの要素のinnerHTMLに作成したいHTMLを挿入する。
  3. templateタグを使う

要素の属性の取得・変更

データ属性

データ属性はユーザーが独自で値を保持するためのHTML属性。データ属性は、data-*のような形式で表される。この属性は一時的にJavaScriptで使用する値を保持している。JavaScriptからアクセスするときは、「dataset」という特別なプロパティを通してアクセスする。属性値は文字列として取得される。


要素の位置と大きさの取得と変更

client,offsetの違い

offsetTop offsetLeft clientTop clientLeft offsetParent margin border padding content clientWidth offsetWidth clientHeight offsetHeight

scroll系

レイアウト幅とレンダリング幅

getBoundingClientRectメソッドで取得できる要素の大きさとoffsetWidthなどを指定して取得する値は基本的には同じだが、レイアウト幅はCSSで指定された幅であり、レンダリング幅は実際に画面上に表示される時の幅で、transformプロパティを指定した場合にはoffset系のプロパティはレイアウト幅を取得し、getBoundingClientRectメソッドはレンダリング幅を取得する。


トップへ戻る

イベント

JavaScriptでイベントを登録する方法

イベントハンドラ

イベントリスナ

イベントリスナの登録
イベントリスナの解除

イベントの伝播

イベントの伝播とはページ内のどこかでイベントが発生した場合にイベントが要素間を伝播していくこと。

Eventオブジェクト

Eventオブジェクトには、イベントの発生状況にかかわる情報が格納されている。

どのイベントタイプでも使用できる共通のプロパティとメソッド
Eventオブジェクトのメソッド
メソッド説明
preventDefault()ブラウザのデフォルトの処理の実行を抑止する。抑止可能なイベントタイプはcanselableがtrueのイベント
stopPropagation()キャプチャリング、バブリングによるイベント伝播を抑止する。
stopImmediatePropagation()stopPropagation()の作用に加え、自要素に対して複数アクションが登録されている場合には、後続のアクションの実行を抑止する。(今実行されているアクションのみ正常に実行される。)
Eventオブジェクトのプロパティ
プロパティ説明
typeイベントタイプが文字列で渡される。
cancelablepreventDefault()を使ってデフォルト処理をキャンセルできるかどうかを返す。trueの場合キャンセル可能
bubbles発声中のイベントでバブリングが発生するかどうかを返す。trueの場合バブリングが発生する。
currentTargetアクションを登録した要素を返す。キャプチャリングやバブリングが発生しているときも常にアクションを登録した要素を返すことに注意。
target実際にイベントが発生した要素を返す。キャプチャリングやバブリングの作用によって、実際にイベントが発生した要素とアクションが登録されている要素が異なる可能性に注意。
defaultPreventedpreventDefault()によって、ブラウザのデフォルト処理がキャンセルさえたかどうかを表す。trueの場合、キャンセルされた状態を表す。
eventPhase実行中のイベントフェーズを表す。
数値説明
0(Event.NONE)実行中のイベントがない状態
1(Event.CAPTURING_PHASE)キャプチャリングフェーズ
2(Event.AT_TARGET)ターゲットフェーズ
3(Event.BUBBLING_PHASE)バブリングフェーズ
timestampドキュメントの生成からイベントの発生までの時間を返す
isTrustedイベントがユーザー操作によって発生したものか、スクリプトによって発生したものかを判定する。ユーザー操作によって発生した場合、true

イベントをスクリプトから実行

イベント一覧

キーボード操作に関するイベント
イベントタイプ発火タイミング
input<input>要素のvalue属性の値や<textarea>のコンテンツが変化する度に発火する。
change<input>要素のvalue属性の値や<textarea>のコンテンツ値が確定したタイミングで発火する。値の変更後、フォーカスが外れるタイミングとなる。
keydown任意のキーが押し込まれたときに発火する。
keypress非推奨。代わりにkeydownを利用する。
keyup任意のキーを離すタイミングで発火する。
compositionstartIMEによる編集セッションが開始したタイミングで発火する。
compositionendIMEによる編集セッションが終了したタイミングで発火する。漢字などの変換が確定したときに、または編集をキャンセルしたタイミングで発火する。
compositionupdateIMEによる編集セッション中で文字が追加されたときに発火する。
submitフォームが送信されたときに発火する。
マウス操作に関するイベント
イベントタイプ発火タイミング
clickマウスの左クリックが押されたときに発火する。
dblclickマウスの左クリックが2回連続で押されたときに発火する。
contextmenuコンテキストメニューを開く時に発火する。すなわち、マウスの右クリック、またはメニューキーが押されたときに発火する。
mousedownマウスでクリックされたときに発火する。左クリック、右クリックどちらでも発火する。
mouseupマウスのクリックが話される時に発火する。左クリック、右クリックどちらでも発火する。
mouseenterカーソルが要素内に入るタイミングで発火する。(バブリングは発生しない)
mouseoverカーソルが要素、又はその子要素を通過するときに発火する。(バブリングが発生する。)
mousemoveカーソルが要素内で移動している間に連続的に発火する。
mouseleaveカーソルが要素から出たときに発火する。(バブリングは発生しない)
mouseoutカーソルが要素から出たときに発火する。(バブリングが発生する)
カット、コピー、ペーストなどに関するイベント
イベントタイプ発火タイミング
copyコピー操作を行ったときに発火する
pasteペースト操作を行ったときに発火する
cutカット操作を行ったときに発火する
フォーカス関するイベント
イベントタイプ発火タイミング
focusin要素にフォーカスが当たった時に発火する。(バブリングが発生する)
focus要素にフォーカスが当たった時二発火する。(バブリングは発生しない)
focusout要素からフォーカスが外れたときに発火する。(バブリングが発生する)
blur要素からフォーカスが外れたときに発火する。(バブリングは発生しない)
スクロールや画面タッチに関わるイベント
イベントタイプ発火タイミング
scroll画面がスクロールしている間は連続的に発火する。
wheelマウスのホイールが回転している間は連続的に発火する。
mousewheel代わりにwheelイベントを使用する
touchstartスマホのタッチ入力が開始されたタイミングで発火する
touchmoveスマホのタッチ入力が開始されたタイミングで発火する
touchendスマホのタッチ入力が終了したタイミングで発火する
アニメーションに関わるイベント
イベントタイプ発火タイミング
transitionstartCSSのtransitionプロパティによるアニメーション開始時に発火する。トランジションの遅延(transition-delay)を待ってから発火する
transitionrunCSSのtransitionプロパティによるアニメーション開始時に発火する。トランジションの遅延(transition-delay)を待たずに発火する
transitionendCSSのtransitionプロパティによるアニメーション終了時に発火する。
animationstartCSSのanimationプロパティによるアニメーション開始時に発火する。アニメーションの遅延(animation-delay)を待ってから発火する。
animationendCSSのanimationプロパティによるアニメーション終了時に発火する。すなわち、animation-iteration-countで指定した回数分アニメーションが実行された後に発火する
animationiterationCSSのanimationプロパティによるアニメーションが1回ループしたタイミングで発火する。すなわち、animation-iteration-countに設定された回数だけ発火する
画面(Window)に関わるイベント
イベントタイプ発火タイミング
loadCSS(.css)/JS(.js)ファイル、画像などのHTMLから読み込んでいるすべてのリソースが読み込み完了した時点で発火する。
DOMContentLoadedDOMツリーの構築が完了した時点で発火する。DOM操作が行える状態になったことを表す最初のイベント。CSS(.css)/JS(.js)ファイル、画像などの読み込みは完了していない可能性がある。Documentオブジェクトに対するイベントリスナとしても登録可能。
readystatechangeDocumentオブジェクトに登録可能なイベントタイプ。画面の読み込みフェーズが変わったタイミングで発火する。readyStateプロパティによって、現在どのフェーズかを判断できる。
document.readyStateプロパティの値
値説明
loading画面ロード中。DOMツリーの構築も完了していない
interactiveDOMツリーの構築が完了している(DOMContentLoadedと同じ状態)
completeloadイベントの直前に発火する。HTMLおおびHTMLで読み込んでいるリソース(CSS/JSファイル、画像など)の読み込みも完了している
beforeunload現在表示中のページがアンロードされる直前に発火する
unload現在表示中のページがアンロードされるときに発火する
resize画面サイズが変更されたときに発火する
onlineブラウザがネットワーク接続を検知したタイミングで発火する
offlineブラウザがネットワーク接続の切断を検知したタイミングで発火する。

トップへ戻る

モジュール

意味のある機能のまとまりとして記述されたもの

一般的なモジュールの要件

モジュールをインターフェイス経由でのみ使用できるようにすることで、モジュール同士の結びつきを弱めて、モジュールの追加や交換を容易にすることができる。機能同士が希薄な関係であることを疎結合と言う。疎結合に保った機能を提供することでコードの可読性、保守性、再利用性を向上させることができる。

JavaScriptにおけるモジュールシステム

エクスポート

ES Moduleのエクスポート(外部への露出)3つの方法

インポート

静的インポート(Static Imports)

コードを読み込んだ時点で、インポート先のモジュールはすでに決定される。JavaScriptでインポートと言う場合にはこちらの方法を指す。静的インポートではインポート先のモジュールのトップレベルのコードの実行までを行う。なお、トップレベルのコードの実行は一度のみで再度インポートされた場合には省略される。

静的インポートの2つの特徴

動的インポート(Dynamic Imports)

コードを実行する段階で初めて、どのモジュールを読み込むかが決定される。必要な時に他のモジュールを読み込むことができる。


Strictモード

Strictモードは「"use strict;"」と記述すると有効になる。また、type="module"属性を記述したscriptタグではデフォルトで有効。さらにclass内のコンストラクタやメソッドでも有効

Strictモードによる影響

トップへ戻る

Node.js

Node.jsはブラウザからJavaScriptを実行する機能を抽出したもの。Web APIの大部分は利用できない。(DOMインターフェイスも存在しない)

Node.jsの環境構築

LTS版:Node.jsのダウンロードURL

ESModuleの有効化

パッケージ管理ソフト(npm)

パッケージ管理ソフトにはyarnというものもある。(Facebookが中心となって開発している)

npm(Node Package Manager)

プログラムをパッケージ単位で追加・削除できる。Node.jsに含まれている。package.jsonというファイルを使ってパッケージの状態を保持している。package.jsonにはプロジェクトにかかわる情報を記述できる。

package.jsonサンプル

  1. パッケージの公開に関係するフィールド
  2. nameパッケージ名(リポジトリ名やフォルダ名などをつける)
    author作者名(サイトURL)
    versionバージョン名(1.20.1のような3つの数値で表す)
    descriptionパッケージの説明
    repositoryリポジトリの情報
    privatetrueの場合は、公開のコマンドを流しても公開されない
    main外部からパッケージを使うときのエントリーポイントを記述する。パッケージが読み込まれたときにはエントリーポイントに指定したファイルが実行され、エクスポートされた関数やクラスが使用可能な状態になる
  3. パッケージの実行に関するフィールド
  4. typeES Modules(module)又はCommonJS(commonjs)を指定する。省略された場合は、CommonJSの規格に沿ってコードが実行される。
    scriptsパッケージで使うスクリプトを登録する。ここに登録したスクリプトは「npm run <スクリプト> 」で実行可能となる。また、「start,stop,restart,test」で登録されたスクリプトに関しては、runを省略してnpm startのように実行できる。
    dependenciesコードの実行に必要なパッケージを記述する。通常はnpm installコマンドを実行することで自動的に記述されるため手動で変更することはない。
    devDependencies開発時に必要なパッケージを記述する。例えば、本番用コードを生成する時に使うパッケージやテストスクリプトを実行するときに使うパッケージなど。npm installコマンドを実行することで自動的に入力されるため、手動で変更することはない。
    optionalDependencies任意で使用可能なパッケージを記述する。ここに追加されたパッケージが何らかの理由で動作しない場合にも、それ以外の機能は問題なく動作するように作成する
    engines実行時に昇給されるNode.jsとnpmのバージョンを記述する
    browserslistブラウザやNode.jsのサポートをどこまで行うか記述する。パッケージの本番用コードをビルドする時に主に使用される。代表的なモジュールバンドラであるwebpackはコードをビルドする時にbrowserslistフィールドにサポート対象のブラウザの設定があれば、その ブラウザで動作するうように広報互換のコードを自動的に注入する。CSSのコードに広報五感を持たせるAutoprefixerなどもこの設定を参照する。

    Node.jsのコマンド

    コマンド説明
    node -e "コード"コマンドラインでコードを実行
    node ./filepath/file.js --input-type=modulejavascriptをES Moduleで実行する。
    node run <スクリプト>package.jsonで指定したスクリプトを実行することができる。(jsonオブジェクトscriptsのstart,stop,restart,testを<スクリプト>に指定して実行する。
    npm init -ypackageの初期化を対話型で行う。-yでデフォルト設定。
    npm install --productionpackage.jsonが配置されているディレクトリで実行することで、package.jsonのdependencies、devDependencies、optionalDependenciedリストに記述しているパッケージをすべてインストールする。インストールされたパッケージは同階層に作成されるnode_modulesフォルダに格納される。
    npm install --productionオプション--productionはdependenciedリスト、optionalDependenciesリストのパッケージのみインストールする。環境変数にNODE_ENVを設定し、その値としてproductionが設定されている場合も同様
    npm install <パッケージ名>[@<バージョン>]
    npm install <Gitホスト>:<Gitユーザー>/<リポジトリ名>
    npm install <GitリポジトリURL>
    npm install <.tar, .tar.gz, or .tgz形式の圧縮ファイルへのパス,またはURL>
    npm install <ローカルフォルダへのパス>
    トップへ戻る

    用語集

    用語説明備考
    JavaScriptエンジンJavaScriptを解析して実行する処理機能(Chrom:V8、Safari:JavaScriptCore、Firefox:SpiderMonkey、Edge:V8)
    Node.jsJavaScriptが動作する環境、ブラウザなしでスクリプトを実行できる。
    CommonJSNode.jsのみで利用可能。モジュール
    ES Modulesscriptタグに対してtype="module"を設定することで利用可能。
    strictモードファイルの先頭に"use strick;"を記入することで利用可能。
    HTMLパーサー
    コード記述JavaScriptは大文字と小文字を厳密に使い分ける必要がある。
    空白文字無視して実行。
    ;改行を挟んだ場合には不要
    マジックナンバーコード中にじかに記述された用途のわからない数字のこと。
    仮引数関数宣言時に設定する引数のこと。
    実引数関数実行時に渡す引数のこと。
    プロパティ記述子
    _変数名クラス内のみの利用を表す。
    Web Storage APIブラウザにデータを保存することができる機能を提供する。localStorageオブジェクト(ローカルストレージ)またはsessionStorageオブジェクト(セッションストレージ)から使うことができる。
    オリジンURLのスキーム、ドメイン、ポートのこと。ローカルストレージは接続先のサーバーのオリジン単位で値が保存される。同じオリジン内のデータであれば、ブラウザのタブやウィンドウを跨いでデータの取得が可能。「スキーム://ドメイン:ポート」なので「http://localhost:80/index.html」と「http://localhost:80/dir/item.html」は同一オリジン。またローカルストレージには保存期限がないため、開発ツールやclear()、removeItem()で消去しない限りデータが失われることはない。
    セッションWebシステムにおけるセッションはブラウザがサーバーとの接続をしてから切断するまでの一連の操作や通信のこと。
    シャローコピー参照アドレスのコピーであること。この場合はオブジェクトのアドレスをコピーする。
    ディープコピーオブジェクト自体のコピーであること。この場合は同一のオブジェクトを別の配列に代入する。多階層配列においては下位配列のアドレスのみを格納しているようだ。
    反復可能オブジェクトイテレーターを保持しているオブジェクトのことで、イテレータは主にオブジェクトの反復処理の挙動を定義するためにつかわれる。
    DOM(Document Object Model)
    DOMオブジェクトDOMインターフェースというプロパティやメソッドを扱うもの。これによってHTMLタグとの変換がブラウザ上で行われている。
    セレクタ文字列JavaScriptやCSSのコード内でHTML要素を特定する時に使う文字列のこと。
    レイアウト幅CSSで指定された幅
    レンダリング幅実際に描画された幅
    アクションイベントが発生したときに実行される関数
    イベントハンドラwindowオブジェクト、elementオブジェクト、documentオブジェクトのonから始まるプロパティ。ここに関数を登録することでリアクションを定義できる。
    イベントリスナイベントにアクションを紐づける仕組みのこと。オプションの指定が可能で、複数のアクションを登録できる。アクションごとに登録解除が可能。以上の点でイベントハンドラと異なる。

    コールバック関数

    関数を引数として受け取ることができる。関数の()は実行を表す。

    トップへ戻る

    コード一覧

    コード引数説明
    コメント表記
    //文章一行コメント
    /* 文章 *//区間コメント
    変数
    var 変数名 = 値;変数を定義する(グローバルスコープ)
    let 変数名 = 値;変数を定義する
    const 変数名 = 値;定数を定義する
    ${変数名}テンプレートリテラル。文字列中に任意の変数の値を表示する。
    let オブジェクト名 = {プロパティ1: 値1,プロパティ2: 値2,プロパティ3: 値3,ネストプロパティ名:{プロパティ1: 値1,プロパティ2: 値2},};オブジェクトの初期化
    オブジェクト名.プロパティ名ドット記法
    オブジェクト名["プロパティ名"]ブラケット記法。プロパティ名には変数による指定も可能。
    delete オブジェクト名.プロパティ名;プロパティを削除、変数は削除できない。
    let オブジェクト名 = {プロパティ: function(引数){関数処理文} };プロパティに関数を定義
    オブジェクト.プロパティ = function(引数){関数の処理}プロパティにメソッドを追加。
    オブジェクト.プロパティ(引数);メソッドの実行。
    let 変数名 = Symbol("ラベル");シンボル型の定義。JavaScriptエンジンが新しい機能を追加するときに既存の機能を壊さないためのデータ型。列挙対象にならない。
    let 変数名 = [値1,値2,値3,値4,...];配列の宣言
    関数
    window.alert(string st)string:表示文字列stの内容をアラート表示(ダイアログ)
    window.close()現在のウィンドウを閉じる
    window.open(string link,"window","width=x,height=y")
    console.log(string st)string:表示文字列stの内容をコンソールに表示
    document.write(string st)string:表示文字列stの内容を画面上に表示
    Number(値)数値へ変換する値数値へ変換。(数値以外の場合NaN:Not a Numberを返す。
    Boolean(値)真偽値へ変換する値真偽値へ変換。
    String(値)文字列へ変換する値文字列へ変換。
    BigInt(値)BigInt型へ変換する値BigIntへ変換。
    Math.random()ランダムな数を生成する。
    Reflect.getOwnPropertyDescriptor(オブジェクト名,"プロパティ名");プロパティ記述子の確認
    Object.getOwnPropertyDescriptor(オブジェクト名,"プロパティ名");プロパティ記述子の確認
    Reflect.defineProperty(オブジェクト,"プロパティ名",{プロパティ記述子:値,プロパティ記述子:値,...});プロパティ記述子の設定方法
    Object.defineProperty(オブジェクト,"プロパティ名",{プロパティ記述子:値,プロパティ記述子:値,...});プロパティ記述子の設定方法
    Object.values(オブジェクト)オブジェクトの値を取得
    Object.keys(オブジェクト)オブジェクトのキーを取得
    eval(文字列)文字列をコードとして実行。
    setTimeout(関数,時間ms,関数の引数)
    関数名.bind(object,param1,param2...)thisで参照するオブジェクトを指定する。関数の引数を指定する。書かれた時点では関数は実行されない。
    関数名.call(object,param1,param2...)bindと同様であるが書かれた時点で実行される。
    関数名.apply(object,array)callと同様であるが、引数を配列で指定する。
    オブジェクト.hasOwnProperty("プロパティ名");プロパティの有無を確認。メソッドは該当しない。自身のオブジェクトのプロパティとして存在するかを確認。
    "プロパティ名" in オブジェクト;オブジェクトがプロパティを有しているかどうかの値。メソッドも該当する。プロトタイプチェーンまで確認する。
    オブジェクト名 instanceof クラス名オブジェクトがクラス名で指定したクラスに属するか。
    Object.create(protoObj);protoObjを__proto__に設定したオブジェクトを生成。
    文字列.split(char separate);文字列を分解
    文字列.length;文字数を取得
    配列.slice(int startIndex,int endIndex)配列から指定範囲を配列として切り取る。

    データ型の種類

    データ型値説明
    String文字列
    Number数値
    BigInt巨大な整数
    Boolean真偽値
    undefined未定義
    Symbolシンボル
    Objectオブジェクト

    演算子

    算術演算子
    記号演算の種類例
    +加算6+9
    -減算20-15
    *乗算3*7
    /除算10/5
    %剰余7%3
    **べき乗3**2
    ++インクリメントa++,++b
    --デクリメントa--,--b
    等価演算子
    演算子用途
    ==値が等しいことを確認
    ===値と型が等しいことを確認
    !=値が等しくないことを確認
    !==値と型が等しくないことを確認
    関係演算子
    演算子用途
    A<BAがBより小さい事を確認
    A>BAがBより大きいことを確認
    A<=BAがB以下であることを確認
    A>=BAがB以上であることを確認
    AinBAのプロパティがBのオブジェクトのプロパティとして含まれるかの確認
    代入演算子
    演算子用途
    =代入
    +=加算の自己代入
    -=減算の自己代入
    *=乗算の自己代入
    /=除算の自己代入
    **=べき乗の自己代入
    &&=論理積の自己代入
    ||=論理和の自己代入
    ??=Null合体の自己代入
    論理演算子
    演算子用途
    &&論理積
    ||論理和
    その他の演算子
    演算子用途
    ,それぞれの演算子を左から評価し、最後のオペラントの値を返す
    単項演算子
    deleteオブジェクトから特定のプロパティを削除
    typeofデータ型の確認
    !真偽値に変換して、反対の真偽値を取得
    +Number型への変換
    -Number型へ変換して、正負を入れ替え
    条件式?{条件式がtruthyの時実行}:{条件式がfalsyの時実行}三項演算子
    let 変数名1 = 変数名2 ?? "初期値";Null合体演算子。左のオペラントがnullまたはundefinedの場合には、右のオペラントを返す。
    変数名?.プロパティ名オプショナルチェイニング演算子。オブジェクト以外の値に関してプロパティを取得したい場合に利用

    キーコード

    "Enter"0x0D(13)
    "Space"0x20(32)
    "Tab"0x09(9)
    "ArrowDown"0x28(40)
    "ArrowLeft"0x25(37)
    "ArrowRight"0x27(39)
    "ArrowUp"0x26(38)
    "Digit1"0x31 (49)
    "Digit2"0x32 (50)
    "Digit3"0x33 (51)
    "Digit4"0x34 (52)
    "Digit5"0x35 (53)
    "Digit6"0x36 (54)
    "Digit7"0x37 (55)
    "Digit8"0x38 (56)
    "Digit9"0x39 (57)
    "Digit0"0x30 (48)
    "KeyA"0x41 (65)
    "KeyB"0x42 (66)
    "KeyC"0x43 (67)
    "KeyD"0x44 (68)
    "KeyE"0x45 (69)
    "KeyF"0x46 (70)
    "KeyG"0x47 (71)
    "KeyH"0x48 (72)
    "KeyI"0x49 (73)
    "KeyJ"0x4A (74)
    "KeyK"0x4B (75)
    "KeyL"0x4C (76)
    "KeyM"0x4D (77)
    "KeyN"0x4E (78)
    "KeyO"0x4F (79)
    "KeyP"0x50 (80)
    "KeyQ"0x51 (81)
    "KeyR"0x52 (82)
    "KeyS"0x53 (83)
    "KeyT"0x54 (84)
    "KeyU"0x55 (85)
    "KeyV"0x56 (86)
    "KeyW"0x57 (87)
    "KeyX"0x58 (88)
    "KeyY"0x59 (89)
    "KeyZ"0x5A (90)

    その他関連

    トップへ戻る