HTML Living Standard  第3部 Javascript 9 基本オブジェクト


 

9 基本オブジェクト

Javascript が持つ基本的なオブジェクトについて説明します。ここでいう「オブジェクト」とは、一般的なオブジェクト指向言語の「クラス」の意味合いです。

また、静的プロパティ、静的メソッドとは、インスタンスを生成しなくても使用できるプロパティ、メソッドです。オブジェクト.プロパティ、オブジェクト.メソッド() のように記述します。

インスタンス・プロパティ、インスタンス・メソッドとは、new 演算子でインスタンスを生成し、インスタンス.プロパティ、インスタンス.メソッド() のように記述します。

9.1  数値(Number)

Number オブジェクトは、数定数や基本データ型などの数値をオブジェクトとして扱うためのラッパーオブジェクトです。

9.1.1  Number オブジェクト

Number オブジェクトの持つプロパティとメソッドについて説明します。

(1) 静的プロパティ(定数)

Number オブジェクトの主なプロパティについて説明します。

プロパティ意味
EPSILONR/O数値として表される 2 個の数の最小の差2.220446049250313e-16 (2-52)
MAX_SAFE_INTEGERR/O確実な整数の最大値9007199254740991 (253-1)
MAX_VALUER/O表現可能な正の数の最大値1.7976931348623157e+308
MIN_SAFE_INTEGERR/O確実な整数の最小値-9007199254740991 (-253-1)
MIN_VALUER/O表現可能な正の数の最小値4.94065645841247e-324
NaNR/O数値ではないことを示す特別な値NaN
NEGATIVE_INFINITYR/O「負の無限大」のことを表す特別な値-Infinity
POSITIVE_INFINITYR/O「正の無限大」のことを表す特別な値Infinity
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
document.getElementById("d1").textContent=Number.EPSILON;
document.getElementById("d2").textContent=Number.MAX_SAFE_INTEGER;
document.getElementById("d3").textContent=Number.MAX_VALUE;
document.getElementById("d4").textContent=Number.MIN_SAFE_INTEGER;
document.getElementById("d5").textContent=Number.MIN_VALUE;
document.getElementById("d6").textContent=Number.NaN;
document.getElementById("d7").textContent=Number.NEGATIVE_INFINITY;
document.getElementById("d8").textContent=Number.POSITIVE_INFINITY;
</script>
実行例

(2) 静的メソッド

Number オブジェクトの主なメソッドについて説明します。一般的なオブジェクト指向言語の「クラスメソッド」の意味合いです。

(2-1) 比較

メソッド引数機能戻り値
isNaN(value)NaN(数値でない)かどうかを返す。数値型で NaN のとき true、それ以外は false
isFinite(value)有限数(MIN_VALUE と MAX_VALUE の間)かどうかを返す。有限数のとき true、そうでないとき false
isInteger(value)整数かどうかを返す。整数のとき true、そうでないとき false
isSafeInteger(value)確実な範囲の整数(MAX_SAFE_INTEGER と MIN_SAFE_INTEGER)の間かどうかを返す。確実な範囲の整数のとき true、そうでないとき false
記述例
<span id="d11"></span> <span id="d12"></span><br>
<!-- 以下略 -->

<script>
document.getElementById("d11").textContent=Number.isNaN("xxx");
document.getElementById("d12").textContent=Number.isNaN(0 / 0);
document.getElementById("d21").textContent=Number.isFinite(1e1000);
document.getElementById("d22").textContent=Number.isFinite(1e308);
document.getElementById("d31").textContent=Number.isInteger(0.5);
document.getElementById("d32").textContent=Number.isInteger(1);
document.getElementById("d41").textContent=Number.isSafeInteger(9007199254740992);
document.getElementById("d42").textContent=Number.isSafeInteger(9007199254740991);
</script>
実行例

注意

Number.isNaN() と isNaN() グローバル関数とでは、結果が異なる場合があります。

Number.isNaN() の場合は、数値型でなければ数値でなくても false だが、isNaN() グローバル関数は、数値に変換できない時点で NaN になり、結果として true となる。

(2-2) 解析

メソッド引数機能戻り値
parseFloat(string)解析値解析値を解析し、数値ならば浮動小数点数を返す。浮動小数点数、NaN(数値に変換できない)、Infinity(無限)
parseInt(string)解析値解析値を解析し、数値ならば整数を返す。整数、NaN(数値に変換できない)
記述例
<span id="d01"></span> <span id="d11"></span><br>
<!-- 以下略 -->

<script>
document.getElementById("d01").textContent=Number.parseFloat("26.7");
document.getElementById("d02").textContent=Number.parseFloat("AAA");
document.getElementById("d03").textContent=Number.parseFloat(5 / 0);
document.getElementById("d11").textContent=Number.parseInt("26.7");
document.getElementById("d12").textContent=Number.parseInt("AAA");
document.getElementById("d13").textContent=Number.parseInt(5 / 0);
</script>
実行例

9.1.2  Number インスタンス

Number インスタンスの持つプロパティとメソッドについて説明します。

(1)インスタンス生成

new Number(number)

Number インスタンスを生成する。

引数 number:数値

戻り値:Number インスタンス

記述例
<div id="d1"></div>
<div id="d2"></div>
<div id="d3"></div>
<script>
let n1 = new Number("123");
document.getElementById("d1").textContent=typeof n1;
let n2 = Number("123");                 // これは Number 関数で、数値に変換している
document.getElementById("d2").textContent=typeof n2;
let n3 = 123;                           // これは数値
document.getElementById("d2").textContent=typeof n3;
</script>

new Number() はインスタンスが生成されるので type は object になります。それ以外は、数値なので number になります。ただし、実用上は暗黙の型変換が行わるためか、これらに余り違いはありません。

実行例

(2) インスタンス・メソッド

Number インスタンスの主なメソッドについて説明します。

(2-1) 有効桁

メソッド引数機能戻り値
toExponential([fractionDigits])小数点の後の桁数規定値:その数を表すのに必要な数の桁指数表記で表した文字列を返す。指数表記
toFixed([digits])小数点の後の桁数規定値:0固定小数点表記で表した文字列を返す。固定小数点表記
toPrecision([precision])有効数字の桁数指定された精度で表した文字列を返す。指定された精度で表した文字列
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
let n = 26.1234;
document.getElementById("d1").textContent=n.toExponential();
document.getElementById("d2").textContent=n.toExponential(2);
document.getElementById("d3").textContent=n.toExponential(4);

document.getElementById("d11").textContent=n.toFixed();
document.getElementById("d12").textContent=n.toFixed(3);

document.getElementById("d21").textContent=n.toPrecision();
document.getElementById("d22").textContent=n.toPrecision(3);
</script>
実行例

(2-2) 文字列変換

メソッド引数機能戻り値
toLocaleString([[locales [, options]]])ロケール、オプション
 ロケール 言語コード一覧
 オプション {名称:値,...} 下表参照
指定された言語やオプションに沿った数値を表した文字列を返す。言語やオプションに沿った数値を表す文字列
toString([radix])基数規定値:10指定された基数で表した文字列を返す。指定された基数で表した文字列
toLocaleString 主なオプション
名称説明
styledecimal数値フォーマット規定値
currency通貨フォーマット
percentパーセントフォーマット
currencystyle="currency" のとき指定
JPY日本円
USDアメリカドル
EURユーロ
GBPイギリスポンド
など
minimumIntegerDigits使用する整数の桁数の最小数1~21規定値:1
minimumFractionDigits使用する小数の桁数の最小数0~20規定値:(decimal、percentのとき 0、currencyのとき 言語による)
maximumFractionDigits使用する整数の桁数の最大数0~20規定値:(decimalのとき minimumFractionDigitsと3の大きい方
     percentのとき minimumFractionDigitsと0の大きい方
     currencyのとき minimumFractionDigitsと言語によって決まる値の大きい方)
minimumSignificantDigits使用する有効桁数の最小値1~21規定値:1
maximumSignificantDigits使用する有効桁数の最大値1~21規定値:minimumSignificantDigits
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
let c = 1234;
document.getElementById("d1").textContent=c.toLocaleString('ja-JP', { style: 'currency', currency: 'JPY' });
document.getElementById("d2").textContent=c.toLocaleString('en-IN', { style: 'currency', currency: 'EUR' });
document.getElementById("d3").textContent=0.352.toLocaleString('ja-JP', { style: 'percent', minimumFractionDigits: 2 });

document.getElementById("d11").textContent=c.toString();
document.getElementById("d12").textContent=c.toString(16);
</script>
実行例

(2-3) 変換

メソッド引数機能戻り値
valueOf()なしプリミティブ(基本データ型の)値を返す。プリミティブ値
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
let n = new Number(26.1234);
let c = new Number(1234);
document.getElementById("d1").textContent=n.valueOf();
document.getElementById("d2").textContent=c.valueOf();
</script>
実行例

9.2  文字列(String)

String オブジェクトは、文字列を扱うためのオブジェクトです。

注意

String オブジェクトは、文字によっては正しく機能しません。例えば、𠀋𡈽𡌛𡑮𡢽 といった文字です。

Windows の内部コードとして使用されている UTF-16 は、ほとんどの文字が 16ビットで定義されており、文字数を数えたり、何文字目かを取り出す場合にも扱いやすいという特徴があります。

しかし、先に挙げた文字は、実は 32ビットで定義された文字で、これらの文字は、String オブジェクトでは、一文字なのに二文字分として扱われてしまい、文字数や文字位置が正しく得られないといったことが起きます。

ただし、これらは JIS X 0213の第3・4水準漢字の一部の文字なので、ほとんど影響はないかもしれません。

9.2.1  String オブジェクト

String オブジェクトの持つプロパティとメソッドについて説明します。

(1) 静的メソッド

String オブジェクトの主なメソッドについて説明します。一般的なオブジェクト指向言語の「クラスメソッド」の意味合いです。

(1-1)文字列生成

UTF-16 で指定された Unicode の文字列を返します。

メソッド引数機能戻り値
fromCharCode(code1[,code2[, ... , codeN]])文字コード
(16ビット)
UTF-16 で指定された Unicode の文字列を返す。文字列
fromCodePoint(code1[,code2[, ... , codeN]])文字コード
(32ビット)
UTF-16 で指定された Unicode の文字列を返す。文字列
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
document.getElementById("d1").textContent=String.fromCharCode(0x41);
document.getElementById("d2").textContent=String.fromCharCode(0x6F22, 0x5B57);
document.getElementById("d3").textContent=String.fromCharCode(0xD840, 0xDC0B);
document.getElementById("d4").textContent=String.fromCharCode(0x2000B);   // 32ビットに非対応(下位16ビットのみ変換)
document.getElementById("d5").textContent=String.fromCodePoint(0x2000B);  // 32ビットに対応
</script>

二つ目の例は、文字コードが2つ指定されていますので2文字になります。

三つ目の例も、文字コードが2つ指定されていますが、こちらは1文字です。このコードは32ビットで1文字を表します。

四つ目と五つ目の例は、三つ目の例と同じ文字を32ビットで指定していますが、fromCharCode は非対応です。

実行例

9.2.2  String インスタンス

String インスタンスの主なプロパティとメソッドについて説明します。一般的なオブジェクト指向言語の「インスタンスプロパティ」「インスタンスメソッド」の意味合いです。

(1) インスタンス生成

new String(string)

String インスタンスを生成する。

引数 string:文字列に変換する対象

戻り値:String インスタンス

記述例
<div id="d1"></div>
<div id="d2"></div>
<div id="d3"></div>
<script>
let s1 = new String(123);
document.getElementById("d1").textContent=typeof s1;
let s2 = String(123);                   // これは String 関数で、文字列に変換している
document.getElementById("d2").textContent=typeof s2;
let s3 = "123";                         // これは文字列
document.getElementById("d2").textContent=typeof n3;
</script>

new String() はインスタンスが生成されるので type は object になります。それ以外は、文字列なので string になります。ただし、実用上は暗黙の型変換が行わるためか、これらに余り違いはありません。

実行例

(2) インスタンス・プロパティ

プロパティ
lengthR/O文字列の文字数
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
document.getElementById("d1").textContent="ABC".length;
document.getElementById("d2").textContent="漢字".length;
document.getElementById("d3").textContent="".length;

document.getElementById("d4").textContent="𠀋".length;
</script>

"𠀋" という文字は UTF-16 で 32ビットのコードなので、一文字なのに length は 2 が返ってきています。

実行例

(3) インスタンス・メソッド

(3-1) 比較

文字列をロケール、オプションを考慮して比較し、その大小関係を返します。

メソッド引数機能戻り値
localeCompare(search[,locales, option])検索文字列、ロケール、オプション
 ロケール 言語コード一覧
 オプション {名称:値,...} 下表参照
「ロケール」や「オプション」に従って検索し
その結果を返す。
「検索文字列」が
大きければ 負
等しければ 0
小さければ 正
localeCompare 主なオプション
名称説明
sensitivity"base"ベース文字が異なる場合等しくないとする(a ≠ b, a = á, a = A)
"accent"ベース文字、アクセントや発音記号が異なる場合等しくないとする(a ≠ b, a ≠ á, a = A)
"case"ベース文字や大文字・小文字が異なる場合等しくないとする(a ≠ b, a ≠ A, a = á)
"variant"文字が異なれば等しくないとする(a ≠ b, a ≠ A, a ≠ á  通常の比較)
ignorePunctuationtrue句読点を無視する
false句読点を無視しない規定値
numerictrue数値として比較("2" < "10")
false文字列として比較("10" < "2")規定値
caseFirst"upper"大文字 < 小文字(昇順の場合、大文字が先に並ぶ)
"lower"小文字 < 大文字(昇順の場合、小文字が先に並ぶ)
falselocales のデフォルトを使用規定値
記述例
<span id="d01"></span> <span id="d11"></span> <span id="d21"></span> <span id="d31"></span><br>
<!-- 以下略 -->

<script>
let s = new String("ああ");
document.getElementById("d01").textContent=s.localeCompare("あ、い");
document.getElementById("d02").textContent=s.localeCompare("あ、い", "ja", {ignorePunctuation:true});
document.getElementById("d03").textContent=s.localeCompare("あ、い", "ja", {ignorePunctuation:false});
s = "2"
document.getElementById("d11").textContent=s.localeCompare("10");
document.getElementById("d12").textContent=s.localeCompare("10", "ja", {numeric:true});
document.getElementById("d13").textContent=s.localeCompare("10", "ja", {numeric:false});
s = "AA"
document.getElementById("d21").textContent=s.localeCompare("aa");
document.getElementById("d22").textContent=s.localeCompare("aa", "en", {caseFirst:true});
document.getElementById("d23").textContent=s.localeCompare("aa", "en", {caseFirst:"upper"});
document.getElementById("d24").textContent=s.localeCompare("aa", "en", {caseFirst:"lower"});
s = "\xE1" // á
document.getElementById("d31").textContent=s.localeCompare("a");
document.getElementById("d32").textContent=s.localeCompare("a", "fr", {sensitivity:"base"});
document.getElementById("d33").textContent=s.localeCompare("a", "fr", {sensitivity:"accent"});
document.getElementById("d34").textContent=s.localeCompare("a", "fr", {sensitivity:"case"});
document.getElementById("d35").textContent=s.localeCompare("a", "fr", {sensitivity:"variant"});
</script>
実行例

(3-2) 存在チェック

文字列を検索して、存在しているかどうかを返します。

メソッド引数機能戻り値
includes(search[, position])検索文字列、検索開始位置規定値:0「検索開始位置」以降に「検索文字列」があるかどうかを返す。あれば true、なければ false
startsWith(search[, position])検索文字列、検索開始位置規定値:0「検索開始位置」から「検索文字列」が始まっているかどうかを返す。始まっていれば true、いなければ false
endsWith(search[, length])検索文字列、検索文字列長規定値:文字列長「検索文字列長」-1の位置で「検索文字列」が終わっているかどうかを返す。終わっていれば true、いなければ false
記述例
<span id="d01"></span> <span id="d11"></span> <span id="d21"></span><br>
<!-- 以下略 -->

<script>
let s = new String("ABCDEFGABC");
document.getElementById("d01").textContent=s.includes("BC");
document.getElementById("d02").textContent=s.includes("X");
document.getElementById("d03").textContent=s.includes("CD", 3);
document.getElementById("d11").textContent=s.startsWith("ABC");
document.getElementById("d12").textContent=s.startsWith("ABC", 1);
document.getElementById("d13").textContent=s.startsWith("ABC", 7);
document.getElementById("d21").textContent=s.endsWith("BC");
document.getElementById("d22").textContent=s.endsWith("BC", 9);
document.getElementById("d23").textContent=s.endsWith("BC", 3);
</script>
実行例

(3-3) 存在位置

文字列を検索して、存在している位置を返します。

メソッド引数機能戻り値
indexOf(key[, from])検索文字列、検索開始位置規定値:0「検索開始位置」から後ろに向かって「検索文字列」を検索し見つかった位置を返す。あれば 位置(>=0)、なければ -1
lastIndexOf(key[, from])検索文字列、検索開始位置規定値:文字列長「検索開始位置」から前に向かって「検索文字列」を検索し見つかった(前からの)位置を返す。あれば 位置(>=0)、なければ -1
記述例
<span id="d01"></span> <span id="d11"></span><br>
<!-- 以下略 -->

<script>
let s = new String("ABCDEFGABC");
document.getElementById("d01").textContent=s.indexOf("BC");
document.getElementById("d02").textContent=s.indexOf("BC", 2);
document.getElementById("d03").textContent=s.indexOf("X");
document.getElementById("d11").textContent=s.lastIndexOf("ABC");
document.getElementById("d12").textContent=s.lastIndexOf("ABC", 7);
document.getElementById("d13").textContent=s.lastIndexOf("G", 6);
</script>

lastIndexOf("ABC", 7) の結果が 7 である点に注意してください。検索開始位置は 7 なので、検索範囲は、ABCDEFGA ですが、7文字目の A が検索文字列の先頭文字の A と等しいので、その後ろの BC が比較され、結果として等しいため 7 が返るようです。

実行例

(3-4) マッチング

正規表現に一致する文字列が存在しているかどうかを検査し、その文字列や位置を返します。

引数は文字列ではありません。正規表現を "" で囲まないで、直に書きます。

メソッド引数機能戻り値
match(regexp)正規表現
 正規表現一覧
「正規表現」に一致した部分の文字列を返す。一致したら 文字列(複数見つかれば文字列の配列)、しなければ null
search(regexp)正規表現「正規表現」に一致した部分の位置を返す。一致したら 位置(>=0)(複数見つかっても先頭位置のみ)、しなければ -1
記述例
<span id="d01"></span> <span id="d11"></span><br>
<!-- 以下略 -->

<script>
let s = new String("ABCDxEFGxABxC");
document.getElementById("d01").textContent=s.match(/x./);
document.getElementById("d02").textContent=s.match(/B.{0,2}/g);
document.getElementById("d03").textContent=s.match(/^B/);
document.getElementById("d11").textContent=s.search(/x./);
document.getElementById("d12").textContent=s.search(/B.{0,2}/g);
document.getElementById("d13").textContent=s.search(/^B/);
</script>

正規表現が /B.{0,2}x/g (B で始まり x で終わる 2~4 文字の文字列)のときは複数の位置に一致するはずですが、search では最初の位置しか戻り値に設定されません。

実行例

(3-5) 部分取り出し

文字列の一部分を取り出します。

メソッド引数機能戻り値
charAt(index)文字位置文字列から指定された「文字位置」の文字を返す。指定位置の文字
substring(from[, to])最初の位置、最後の位置規定値:文字列長「最初の位置」から「最後の位置」の前の文字までを取り出して返す。負数のときは 0 と見なす。取り出した文字列
slice(from[, to])最初の位置、最後の位置規定値:文字列長「最初の位置」から「最後の位置」の前の文字までを取り出して返す。負数のときは 文字列長+from、文字列長+to と見なす。取り出した文字列
substr(from[, len])最初の位置、文字長規定値:文字列長「最初の位置」から「文字長」分を取り出して返す。「最初の位置」が負数のときは 文字列長+from と見なす。取り出した文字列
charCodeAt(index)文字位置文字列から指定された「文字位置」の UTF-16 のコードを返す。指定位置の文字の UTF-16 のコード
記述例
<span id="d01"></span> <span id="d11"></span><br>
<!-- 以下略 -->

<script>
let a = "ABCDEFGHIJ";
let k = "あいうえお";
document.getElementById("d01").textContent=a.charAt(2);
document.getElementById("d02").textContent=k.charAt(2);
document.getElementById("d11").textContent=a.substring(2,4);
document.getElementById("d12").textContent=k.substring(2,4);
document.getElementById("d21").textContent=a.slice(2,4);
document.getElementById("d22").textContent=k.slice(2,4);
document.getElementById("d31").textContent=a.slice(-4,-2);
document.getElementById("d32").textContent=k.slice(-4,-2);
document.getElementById("d41").textContent=a.substr(2,4);
document.getElementById("d42").textContent=k.substr(2,4);
document.getElementById("d51").textContent=a.substr(-4,2);
document.getElementById("d52").textContent=k.substr(-4,2);
document.getElementById("d61").textContent=a.charCodeAt(2).toString(16);
document.getElementById("d62").textContent=k.charCodeAt(2).toString(16);
</script>

最後の charCodeAt は UTF-16 のコードが返ってくるので、16進数表示にしています。ちなみに 43 は 'C' で、3046 は 'う' です。

実行例

(3-6) トリミング

文字列の前後の空白(全角空白、タブ、改行なども含む)を取り除きます。

メソッド引数機能戻り値
trim()なし文字列の両端の空白(全角空白、タブ、改行など)を取り除いた文字列を返す。取り出した文字列
trimLeft()なし文字列の左端の空白(全角空白、タブ、改行など)を取り除いた文字列を返す。取り出した文字列
trimRight()なし文字列の右端の空白(全角空白、タブ、改行など)を取り除いた文字列を返す。取り出した文字列
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
let a = "	 \n ab c	 \n ";  // "(タブ)(全角空白)\n(空白)ab(空白)c(タブ)(全角空白)\n(空白)"
document.getElementById("d1").textContent="|" + a.trim() + "|";
document.getElementById("d2").textContent="|" + a.trimLeft() + "|";
document.getElementById("d3").textContent="|" + a.trimRight() + "|";
</script>
実行例

(3-7) 分割と連結

文字列を分割しその部分文字列を取り出したり、2つの文字列を連結したり、同じ文字列を繰り返し生成し連結します。

メソッド引数機能戻り値
split(sep[, limit])区切り文字、分割数規定値:文字数文字列を「区切り文字」で分割し、最大で「分割数分」だけ取り出した文字列を配列として返す。取り出した文字列の配列
concat(string)追加文字列文字列の後ろに「追加文字列」を連結した文字列を返す。連結した文字列
repeat(count)繰り返し回数文字列を繰返し回数分生成し連結した文字列を返す。繰返し生成し連結した文字列
記述例
<span id="d01"></span> <span id="d02"></span> <span id="d03"></span> <!-- 中間略 --> <span id="d07"></span><br>
<!-- 以下略 -->

<script>
function set(n, w) {
  for (var i = 0 ; i < w.length ; i++) {
    document.getElementById(n + (i + 1)).textContent="'" + w[i] + "'";
  }
}
let a = "abc,de,,f,g,";
let w = a.split(",");
set("d0", w);
w = a.split(",", 4);
set("d1", w);

document.getElementById("d21").textContent="abcde".concat("xyz");
document.getElementById("d31").textContent="○×".repeat(5);
</script>
実行例

(3-8) 置換

文字列の一部分を別の文字列に置き換えます。

メソッド引数機能戻り値
replace(regexp, newString)文字列または正規表現、置換文字列
正規表現一覧
「文字列」または「正規表現」に一致した部分文字列を「置換文字列」で置き換えた文字列を返す。置き換えた文字列
replace(regexp, function)正規表現、関数「正規表現」で分割した部分文字列を受け取った「関数」の戻り値を返す。「関数」の戻り値
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
document.getElementById("d1").textContent="abcdebcd".replace("bc", "xyz");
document.getElementById("d2").textContent="a1b23c456d78e".replace(/\d/g, "#");
document.getElementById("d3").textContent="ABC,XY".replace(/(.*),(.*)/, function(str, p1, p2) {return p2 + "," + p1});
document.getElementById("d4").textContent="abcde".replace("x", "#");
</script>

1つ目は最初に見つかった "bc" を "xyz" に置き換えています。

2つ目は正規表現ですべての数字を捜し "#" に置き換えています。

3つ目は正規表現によって "," で分割し、関数に引数として渡しています。この例では、str が元の文字列の "ABC,XY"、p1 が "ABC"、p2 が "XY" です。分割数が多い場合はそれに合わせて引数を増やします。

4つ目は一致する文字列がありませんので、置換されず元の文字列のままになります。

実行例

(3-9) 変換

文字列の大文字・小文字を変換した文字列に置き換えます。

メソッド引数機能戻り値
toUpperCase()なし大文字に変換した文字列を返す。大文字に変換した文字列
toLowerCase()なし小文字に変換した文字列を返す。小文字に変換した文字列
toLocaleUpperCase()なしロケール固有のケースマッピングに従って大文字に変換した文字列を返す。大文字に変換した文字列
toLocaleLowerCase()なしロケール固有のケースマッピングに従って小文字に変換した文字列を返す。小文字に変換した文字列
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
let a = "Aa Àà Аа Αα Aa あぁ";
document.getElementById("d1").textContent=a.toLowerCase();
document.getElementById("d2").textContent=a.toUpperCase();
document.getElementById("d3").textContent=a.toLocaleLowerCase();
document.getElementById("d4").textContent=a.toLocaleUpperCase();
</script>

現状、変化があるのはアルファベットだけのようです。また、toLowerCase() と toLocaleLowerCase() との違いはないようです。

ちなみに文字は、英語 フランス語 ロシア語 ギリシャ語 全角 ひらがな の順です。

実行例

9.3  日付(Date)

Date オブジェクトは、日付や時刻を扱うオブジェクトです。

9.3.1  Date オブジェクト

Date オブジェクトの持つプロパティとメソッドについて説明します。

(1) 静的メソッド

Date オブジェクトの主なメソッドについて説明します。一般的なオブジェクト指向言語の「クラスメソッド」の意味合いです。

(1-1)経過ミリ秒

協定世界時(UTC)の 1970 年 1 月 1 日 00:00:00 から経過したミリ秒を返します。

世界各地の標準時は協定世界時(UTC)を基準として定めており、日本標準時(JST)は協定世界時(UTC)より9時間早く、「GMT+0900」と表記しますが、省略したら日本標準時(JST)になります。

メソッド引数機能戻り値
now()なし1970/1/1 00:00:00 (UTC) から現在までの
経過ミリ秒を返す。
経過ミリ秒
parse(dateString)日時を表す文字列
 例:2019/5/1
 例:1 May 2019
指定された日時の、
1970/1/1 00:00:00 (UTC) からの
経過ミリ秒を返す。
経過ミリ秒
UTC(year, month, day[, hour[, min[, sec[, ms]]]])日時
 year :年(1900~)
 month:月(0~11)
 day  :日(1~31)
 hour :時(0~23)
 min  :分(0~59)
 sec  :秒(0~59)
 ms   :ミリ秒(0~999)
指定された日時 (UTC) の、
1970/1/1 00:00:00 (UTC) からの
経過ミリ秒を返す。
経過ミリ秒
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
document.getElementById("d1").textContent=Date.now();
document.getElementById("d2").textContent=Date.parse("2019/5/1");
document.getElementById("d3").textContent=Date.parse("2019/5/1 12:00:00 GMT+900"); // 日本標準時(GMT+900 は省略できる)
document.getElementById("d4").textContent=Date.parse("2019/5/1 12:00:00 GMT");     // 協定世界時(日本標準時の9時間遅れ)
document.getElementById("d5").textContent=Date.UTC(2019, 4, 1);     // UTC は協定世界時、月は 0~11
document.getElementById("d6").textContent=Date.UTC(2019, 4, 1, 12);
document.getElementById("d7").textContent=Date.UTC(2019, 4, 1, 12, 5);
document.getElementById("d8").textContent=Date.UTC(2019, 4, 1, 12, 5, 30);
document.getElementById("d9").textContent=Date.UTC(2019, 4, 1, 12, 5, 30, 500);
</script>
実行例

9.3.2  Date インスタンス

Date インスタンスの持つプロパティとメソッドについて説明します。

(1) インスタンス生成

new Date()

現在日時(JST)を持つ Date インスタンスを生成する。

戻り値:Date インスタンス

new Date(value)

指定された日時(JST)を持つ Date インスタンスを生成する。

引数 value:1970/1/1 00:00:00 (UTC) からの経過ミリ秒

戻り値:Date インスタンス

new Date(string)

指定された日時を持つ Date インスタンスを生成する。

引数 string:日時を表す文字列

戻り値:Date インスタンス

new Date(year, month, day[, hour[, min[, sec[, ms]]]])

指定された日時を持つ Date インスタンスを生成する。

引数 year :年(1900~)

引数 month:月(0~11)

引数 day  :日(1~31)

引数 hour :時(0~23)

引数 min  :分(0~59)

引数 sec  :秒(0~59)

引数 ms   :ミリ秒(0~999)

戻り値:Date インスタンス

記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
let dt1 = new Date();
document.getElementById("d1").textContent=typeof dt1;
let dt2 = Date();
document.getElementById("d2").textContent=typeof dt2;

document.getElementById("d3").textContent=dt1;
dt1 = new Date("2019/5/1");
document.getElementById("d4").textContent=dt1;
dt1 = new Date("2019/5/1 12:00");
document.getElementById("d5").textContent=dt1;
dt1 = new Date(2019, 4, 1);
document.getElementById("d6").textContent=dt1;
dt1 = new Date(2019, 4, 1, 12, 5, 30, 500);
document.getElementById("d7").textContent=dt1;
</script>

new Date() はインスタンスが生成されるので type は object になります。Date() は、現在の日時を表す文字列なので string になります。ただし、実用上は暗黙の型変換が行わるためか、これらに余り違いはありません。

3行目は現在日時の Date インスタンスが得られます。4行目以降は指定した日時の Date インスタンスが得られます。

実行例

(2) インスタンス・メソッド

(2-1)日本標準時(JST)の取得

日本標準時(JST)の年月日時分秒などを取得します。

メソッド引数機能戻り値
getFullYear()なし4桁の「年」を返す。年(4桁)
getMonth()なし「月」を返す。月(0~11)
getDate()なし「日」を返す。日(1~31)
getHours()なし「時」を返す。時(0~23)
getMinutes()なし「分」を返す。分(0~59)
getSeconds()なし「秒」を返す。秒(0~59)
getMilliseconds()なし「ミリ秒」を返す。ミリ秒(0~999)
getDay()なし「曜日」を返す。曜日(0:日曜日~6:土曜日)
getTime()なし1970/1/1 00:00:00 (UTC) からの経過ミリ秒を返す。1970/1/1 00:00:00 (UTC) からの経過ミリ秒
getTimezoneOffset()なし現地の時間帯のオフセットを分で返す。時間帯のオフセット
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
let dt1 = new Date();
document.getElementById("d1").textContent=dt1.getFullYear();
document.getElementById("d2").textContent=dt1.getMonth();
document.getElementById("d3").textContent=dt1.getDate();
document.getElementById("d4").textContent=dt1.getHours();
document.getElementById("d5").textContent=dt1.getMinutes();
document.getElementById("d6").textContent=dt1.getSeconds();
document.getElementById("d7").textContent=dt1.getMilliseconds();
document.getElementById("d8").textContent=dt1.getDay();
document.getElementById("d9").textContent=dt1.getTime();
document.getElementById("d10").textContent=dt1.getTimezoneOffset();
</script>

日本標準時(JST)の現在時刻を表示しています。

実行例

(2-2)協定世界時(UTC)の取得

協定世界時(UTC)の年月日時分秒などを取得します。

メソッド引数機能戻り値
getUTCFullYear()なし4桁の「年」を返す。年(4桁)
getUTCMonth()なし「月」を返す。月(0~11)
getUTCDate()なし「日」を返す。日(1~31)
getUTCHours()なし「時」を返す。時(0~23)
getUTCMinutes()なし「分」を返す。分(0~59)
getUTCSeconds()なし「秒」を返す。秒(0~59)
getUTCMilliseconds()なし「ミリ秒」を返す。ミリ秒(0~999)
getUTCDay()なし「曜日」を返す。曜日(0:日曜日~6:土曜日)
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
let dt1 = new Date();
document.getElementById("d1").textContent=dt1.getUTCFullYear();
document.getElementById("d2").textContent=dt1.getUTCMonth();
document.getElementById("d3").textContent=dt1.getUTCDate();
document.getElementById("d4").textContent=dt1.getUTCHours();
document.getElementById("d5").textContent=dt1.getUTCMinutes();
document.getElementById("d6").textContent=dt1.getUTCSeconds();
document.getElementById("d7").textContent=dt1.getUTCMilliseconds();
document.getElementById("d8").textContent=dt1.getUTCDay();
</script>

協定世界時(UTC)の現在時刻を表示しています。

実行例

(2-3)日本標準時(JST)の設定

日本標準時(JST)の年月日時分秒などを設定します。

メソッド引数機能戻り値
setFullYear()年(4桁)4桁の「年」を設定する。なし
setMonth()月(0~11)「月」を設定する。なし
setDate()日(1~31)「日」を設定する。なし
setHours()時(0~23)「時」を設定する。なし
setMinutes()分(0~59)「分」を設定する。なし
setSeconds()秒(0~59)「秒」を設定する。なし
setMilliseconds()ミリ秒(0~999)「ミリ秒」を設定する。なし
setTime()1970/1/1 00:00:00 (UTC) からの経過ミリ秒1970/1/1 00:00:00 (UTC) からの経過ミリ秒を設定する。なし
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
function disp(d) {
  return d.toLocaleString() + "." + ("00"+d.getMilliseconds()).slice(-3);
}
let dt0 = new Date();    // 現在時刻
let dt1 = new Date(0);   // 1970/1/1 00:00:00
document.getElementById("d1").textContent=disp(dt1);
dt1.setFullYear(dt0.getFullYear());                    // 年
document.getElementById("d2").textContent=disp(dt1);
dt1.setMonth(dt0.getMonth());                          // 月
document.getElementById("d3").textContent=disp(dt1);
dt1.setDate(dt0.getDate());                            // 日
document.getElementById("d4").textContent=disp(dt1);
dt1.setHours(dt0.getHours());                          // 時
document.getElementById("d5").textContent=disp(dt1);
dt1.setMinutes(dt0.getMinutes());                      // 分
document.getElementById("d6").textContent=disp(dt1);
dt1.setSeconds(dt0.getSeconds());                      // 秒
document.getElementById("d7").textContent=disp(dt1);
dt1.setMilliseconds(dt0.getMilliseconds());            // ミリ秒
document.getElementById("d8").textContent=disp(dt1);
dt0 = new Date();    // 現在時刻
dt1.setTime(dt0.getTime());
document.getElementById("d9").textContent=disp(dt1);
</script>

一行目が初期日時ですが、順に年、月、日、時、分、秒、ミリ秒と設定しています。最後の行は、現在時刻を取り直して一度に設定し直しています。

実行例

(2-4)協定世界時(UTC)の設定

協定世界時(UTC)の年月日時分秒などを設定します。

メソッド引数機能戻り値
setUTCFullYear()年(4桁)4桁の「年」を設定する。なし
setUTCMonth()月(0~11)「月」を設定する。なし
setUTCDate()日(1~31)「日」を設定する。なし
setUTCHours()時(0~23)「時」を設定する。なし
setUTCMinutes()分(0~59)「分」を設定する。なし
setUTCSeconds()秒(0~59)「秒」を設定する。なし
setUTCMilliseconds()ミリ秒(0~999)「ミリ秒」を設定する。なし
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
function disp(d) {
  return d.toUTCString() + "." + ("00"+d.getUTCMilliseconds()).slice(-3);
}
let dt0 = new Date();    // 現在時刻
let dt1 = new Date(0);   // 1970/1/1 00:00:00
document.getElementById("d1").textContent=disp(dt1);
dt1.setUTCFullYear(dt0.getUTCFullYear());                    // 年
document.getElementById("d2").textContent=disp(dt1);
dt1.setUTCMonth(dt0.getUTCMonth());                          // 月
document.getElementById("d3").textContent=disp(dt1);
dt1.setUTCDate(dt0.getUTCDate());                            // 日
document.getElementById("d4").textContent=disp(dt1);
dt1.setUTCHours(dt0.getUTCHours());                          // 時
document.getElementById("d5").textContent=disp(dt1);
dt1.setUTCMinutes(dt0.getUTCMinutes());                      // 分
document.getElementById("d6").textContent=disp(dt1);
dt1.setUTCSeconds(dt0.getUTCSeconds());                      // 秒
document.getElementById("d7").textContent=disp(dt1);
dt1.setUTCMilliseconds(dt0.getUTCMilliseconds());            // ミリ秒
document.getElementById("d8").textContent=disp(dt1);
</script>

一行目が初期日時ですが、順に年、月、日、時、分、秒、ミリ秒と設定しています。

実行例

(2-5)文字列変換

日時を文字列に変換します。

メソッド引数機能戻り値
toDateString()なし日付部分を文字列に変換する。アメリカ英語式日付文字列
toTimeString()なし時刻部分を文字列に変換する。アメリカ英語式時刻文字列
toString()なし日時を文字列に変換する。アメリカ英語式日時文字列
toUTCString()なし協定世界時を使って日付を文字列に変換する。「曜日(英略), 日 月(英略) 年 時:分:秒 時間帯」という形式の文字列
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
let dt1 = new Date();    // 現在時刻
document.getElementById("d1").textContent=dt1.toDateString();
document.getElementById("d2").textContent=dt1.toTimeString();
document.getElementById("d3").textContent=dt1.toString();
document.getElementById("d4").textContent=dt1.toUTCString();
</script>
実行例

(2-6)ロケールに従った文字列変換

指定されたロケールやオプションに従って日時を文字列に変換します。ただし、ブラウザによって表示形式が異なります。

メソッド引数機能戻り値
toLocaleDateString([locales][, options])ロケール、オプション
 ロケール 言語コード一覧
 オプション {名称:値,...} 下表参照
ロケールやオプションに従って日付部分を(オプションに weekday を指定すると時刻も)文字列に変換する。日付文字列
toLocaleTimeString([locales][, options])ロケール、オプション
 ロケール 言語コード一覧
 オプション {名称:値,...} 下表参照
ロケールやオプションに従って時刻部分を文字列に変換する。時刻文字列
toLocaleString([locales][, options])ロケール、オプション
 ロケール 言語コード一覧
 オプション {名称:値,...} 下表参照
ロケールやオプションに従って日時を文字列に変換する。日時文字列
toLocaleString() などの主なロケール
説明
"en-US"アメリカ英語式(w, m d yyyy hh:mm:ss)
"ja-JP"日本式(yyyy年m月d日 w曜日 hh:mm:ss)
"ja-JP-u-ca-japanese"日本式(令和 yy年m月d日 w曜日 hh:mm:ss)

toLocaleString() などの主なオプション(基本的に記述したものが表示されます)
(規定値はロケールが日本語のときです)
名称説明
hour1212/24時間表示
true12時間表示
false24時間表示規定値
weekday曜日表示
"narrow"日、月、...(ja-JP などのとき)  Sun、Mon、...(en-US のとき)
"short"日、月、...(ja-JP などのとき)  Sun、Mon、...(en-US のとき)
"long"日曜日、月曜日、...(ja-JP などのとき)  Sunday、Monday、...(en-US のとき)
year年月日時分秒表示
 "numeric" 前 0 なし (9)
 "2-digit"  前 0 あり (09)

 month の場合(en-US のとき)はこれ以外に
 "narrow"  Jan、Feb、...
 "short"   Jan、Feb、...
 "long"    January、February、...
month
day
hour
minute
second
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
let dt1 = new Date(2019,4,1,13,2,3);    // 2019/5/1 13:02:03
document.getElementById("d1").textContent=dt1.toLocaleDateString();
document.getElementById("d2").textContent=dt1.toLocaleDateString("en-US");
document.getElementById("d3").textContent=dt1.toLocaleDateString("ja-JP-u-ca-japanese");
document.getElementById("d4").textContent=dt1.toLocaleDateString("ja-JP", {weekday:"short", month:"long", day:"2-digit"});
document.getElementById("d5").textContent=dt1.toLocaleDateString("ja-JP", {weekday:"long", month:"2-digit", day:"numeric"});

document.getElementById("d11").textContent=dt1.toLocaleTimeString();
document.getElementById("d12").textContent=dt1.toLocaleTimeString("en-US");
document.getElementById("d13").textContent=dt1.toLocaleTimeString("ja-JP-u-ca-japanese");
document.getElementById("d14").textContent=dt1.toLocaleTimeString("ja-JP", {hour12:true, hour:"numeric"});
document.getElementById("d15").textContent=dt1.toLocaleTimeString("ja-JP", {hour12:false, hour:"2-digit"});

document.getElementById("d21").textContent=dt1.toLocaleString();
document.getElementById("d22").textContent=dt1.toLocaleString("en-US");
document.getElementById("d23").textContent=dt1.toLocaleString("ja-JP-u-ca-japanese");
document.getElementById("d23").textContent=dt1.toLocaleString("ja-JP-u-ca-japanese", {year:"numeric"});
document.getElementById("d24").textContent=dt1.toLocaleString("ja-JP", {hour12:true, month:"long", day:"numeric", hour:"numeric"});
document.getElementById("d25").textContent=dt1.toLocaleString("ja-JP", {hour12:false, month:"short", day:"2-digit", hour:"2-digit"});
</script>

ブラウザによって表示形式が異なります。また、オプションによって表示される項目(年月日時分秒)が変わりますが、それもブラウザによって異なります。

実行例
toLocaleString() ブラウザによる表示の違い
ロケールオプション
"ja-JP" 2019/5/1 13:02:03
{year:"numeric"} 2019年
{year:"2-digit"} 19年
{month:"long"} 5月
{month:"short"} 5月
{month:"numeric"} 5月
{month:"2-digit"} 05月
{day:"numeric"} 1日
{day:"2-digit"} 01日
{weekday:"long"} 水曜日
{weekday:"short"}
{hour:"numeric"} 13時
{hour:"2-digit", hour12:true} 午後01時
{minute:"numeric"} 2
{minute:"2-digit"} 2 02 2
{second:"numeric"} 3
{second:"2-digit"} 3 03 3
{year:"numeric",month:"numeric"} 2019/5
{year:"numeric",month:"numeric",
   day:"numeric"}
2019/5/1
{year:"numeric",month:"numeric",
   day:"numeric",weekday:"long"}
2019/5/1水曜日
{year:"numeric",month:"numeric",
   day:"numeric",weekday:"short"}
2019/5/1(水)
{hour:"numeric",minute:"numeric"} 13:02
{hour12:true,hour:"numeric",minute:"numeric"} 午後1:02
{year:"numeric",month:"numeric",day:"numeric",
   hour:"numeric",minute:"numeric"}
2019/5/1 13:02
"ja-JP
-u-ca
-japanese"
R1/5/1 13:02:03
{year:"numeric"} 令和元年
{year:"2-digit"} 令和元年
{year:"numeric",month:"numeric"} R1/5
{year:"numeric",month:"numeric",
   day:"numeric"}
R1/5/1
{year:"numeric",month:"numeric",
   day:"numeric",weekday:"long"}
R1/5/1水曜日
{year:"numeric",month:"numeric",
   day:"numeric",weekday:"short"}
R1/5/1(水)
{year:"numeric",month:"numeric",day:"numeric",
   hour:"numeric",minute:"numeric"}
R1/5/1 13:02

9.4  数学関数(Math)

Math オブジェクトは、数学的な定数と関数を提供するプロパティとメソッドを持つ、組み込みのオブジェクトです。

9.4.1  Math オブジェクト

Math オブジェクトの持つプロパティとメソッドについて説明します。

(1)静的プロパティ(定数)

Math オブジェクトの主なプロパティについて説明します。

プロパティ意味
ER/Oネイピア数(オイラー数)。自然対数の底として用いられる数学定数約 2.71828182845905
LN2R/O2 の自然対数約 0.693147180559945
LN10R/O10 の自然対数約 2.30258509299405
LOG2ER/O2 を底とした E の対数約 1.44269504088896
LOG10ER/O10 を底とした E の対数約 0.434294481903252
PIR/O円周率約 3.14159265358979
SQRT1_2R/O1/2 の平方根約 0.707106781186548
SQRT2R/O2 の平方根約 1.4142135623731
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
document.getElementById("d1").textContent=Math.E;
document.getElementById("d2").textContent=Math.LN2;
document.getElementById("d3").textContent=Math.LN10;
document.getElementById("d4").textContent=Math.LOG2E;
document.getElementById("d5").textContent=Math.LOG10E;
document.getElementById("d6").textContent=Math.PI;
document.getElementById("d7").textContent=Math.SQRT1_2;
document.getElementById("d8").textContent=Math.SQRT2;
</script>
実行例

(2) 静的メソッド

Math オブジェクトの主なメソッドについて説明します。一般的なオブジェクト指向言語の「クラスメソッド」の意味合いです。

(2-1)三角関数

メソッド引数機能戻り値
acos(x)数値アークコサイン (逆余弦) を返す。アークコサイン (逆余弦)値
acosh(x)数値ハイパボリックアークコサイン (双曲線逆余弦)を返す。ハイパボリックアークコサイン (双曲線逆余弦)値
asin(x)数値アークサイン (逆正弦)を返す。アークサイン (逆正弦)値
asinh(x)数値ハイパボリックアークサイン (双曲線逆正弦)を返す。ハイパボリックアークサイン (双曲線逆正弦)値
atan(x)数値アークタンジェント (逆正接)を返す。アークタンジェント (逆正接)値
atanh(x)数値ハイパボリックアークタンジェント (双曲線逆正接)を返す。ハイパボリックアークタンジェント (双曲線逆正接)値
atan2(y, x)数値、数値比率のアークタンジェント (逆正接)を返す。比率のアークタンジェント (逆正接)値
cos(x)数値コサイン (余弦)を返す。コサイン (余弦)値
cosh(x)数値ハイパボリックコサイン (双曲線余弦)を返す。ハイパボリックコサイン (双曲線余弦)値
sin(x)数値サイン (正弦)を返す。サイン (正弦)値
sinh(x)数値ハイパボリックサイン (双曲線正弦)を返す。ハイパボリックサイン (双曲線正弦)値
tan(x)数値タンジェント (正接)を返す。タンジェント (正接)値
tanh(x)数値ハイパボリックタンジェント (双曲線正接)を返す。ハイパボリックタンジェント (双曲線正接)値
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
  document.getElementById("d1").textContent=Math.acos(-1);        // 3.141592653589793
  document.getElementById("d2").textContent=Math.acosh(2);        // 1.3169578969248166
  document.getElementById("d3").textContent=Math.asin(1);         // 1.5707963267948966
  document.getElementById("d4").textContent=Math.asinh(1);        // 0.881373587019543
  document.getElementById("d5").textContent=Math.atan(1);         // 0.7853981633974483
  document.getElementById("d6").textContent=Math.atanh(0.5);      // 0.5493061443340548
  document.getElementById("d7").textContent=Math.atan2(90, 15);   // 1.4056476493802699
  document.getElementById("d8").textContent=Math.cos(Math.PI/3);  // 0.5000000000000001
  document.getElementById("d9").textContent=Math.cosh(1);         // 1.5430806348152437
  document.getElementById("d10").textContent=Math.sin(Math.PI/6); // 0.49999999999999994
  document.getElementById("d11").textContent=Math.sinh(1);        // 1.1752011936438014
  document.getElementById("d12").textContent=Math.tan(1);         // 1.5574077246549023
  document.getElementById("d13").textContent=Math.tanh(1);        // 0.7615941559557649
</script>
実行例

(2-2)対数

メソッド引数機能戻り値
log(x)数値x の自然対数 (loge x)を返す。x の自然対数値
log1p(x)数値x+1 の自然対数 (loge (x+1))を返す。x+1 の自然対数値
log10(x)数値x の常用対数 (log10 x)を返す。x の常用対数値
log2(x)数値x の二進対数 (log2 x)を返す。x の二進対数値
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
document.getElementById("d1").textContent=Math.log(10);        // 約 2.302585092994046
document.getElementById("d2").textContent=Math.log1p(1);       // 約 0.6931471805599453
document.getElementById("d3").textContent=Math.log10(2);       // 約 0.3010299956639812
document.getElementById("d4").textContent=Math.log2(3);        // 約 1.584962500721156
</script>
実行例

(2-3)累乗

メソッド引数機能戻り値
exp(x)数値x の指数値 (ex)を返す。x の指数値
expm1(x)数値x の指数値 - 1 (ex - 1)を返す。x の指数値 - 1 (Ex - 1)
pow(x, y)数値x の y 乗 (xy)を返す。x の y 乗 (xy)値
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
document.getElementById("d1").textContent=Math.exp(1);        // 約 2.718281828459045
document.getElementById("d2").textContent=Math.expm1(-1);     // 約 -0.6321205588285577
document.getElementById("d3").textContent=Math.pow(7, 2);     // 49
</script>
実行例

(2-4)平方根・立方根

メソッド引数機能戻り値
hypot([x[, y[, …]]])数値二乗和の平方根(x2 + y2 + ... の平方根)を返す。二乗和の平方根値
sqrt(x)数値平方根を返す。平方根値
cbrt(x)数値立方根を返す。立方根値
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
document.getElementById("d1").textContent=Math.hypot(3,4,5);    // 約 7.0710678118654755
document.getElementById("d2").textContent=Math.sqrt(2);         // 約 1.414213562373095
document.getElementById("d3").textContent=Math.cbrt(2);         // 約 1.2599210498948734
</script>
実行例

(2-5)繰り上げ・繰り下げ・絶対値

メソッド引数機能戻り値
abs(x)数値絶対値を返す。絶対値
ceil(x)数値小数点以下を切り上げた値を返す。切り上げ値
floor(x)数値小数点以下を切り下げた値を返す。切り下げ値
fround(x)数値最も近い単精度浮動小数点数を返す。最も近い単精度浮動小数点数値
round(x)数値最も近い整数を返す。最も近い整数値
trunc(x)数値小数部を取り除いた整数を返す。小数部を取り除いた整数値
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
document.getElementById("d2").textContent=Math.abs(-2);         // 2
document.getElementById("d2").textContent=Math.ceil(45.95);     // 46
document.getElementById("d3").textContent=Math.floor(45.95);    // 45
document.getElementById("d2").textContent=Math.fround(1.337);   // 約 1.3370000123977661
document.getElementById("d2").textContent=Math.round(20.5);     // 21
document.getElementById("d3").textContent=Math.trunc(42.84);    // 42
</script>
実行例

(2-6)最大・最小

メソッド引数機能戻り値
max([x[, y[, …]]])数値最大の数を返す。最大値
min([x[, y[, …]]])数値最小の数を返す。最小値
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
document.getElementById("d2").textContent=Math.max(5,-2,7,3,2);    // 7
document.getElementById("d2").textContent=Math.min(5,-2,7,3,2);    // -2
</script>
実行例

(2-7)乱数

メソッド引数機能戻り値
random()なし0 以上 1 未満の範囲で疑似乱数を返す。疑似乱数
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
document.getElementById("d1").textContent=Math.random();
</script>
実行例

9.5  配列(Array)

Array オブジェクトは、配列を構築するためのオブジェクトです。

9.5.1  Array オブジェクト

Array オブジェクトの持つプロパティとメソッドについて説明します。


(1) 静的メソッド

Array オブジェクトの主なメソッドについて説明します。一般的なオブジェクト指向言語の「クラスメソッド」の意味合いです。

(1-1)インスタンス生成

メソッド引数機能戻り値
of([value[,value,...]])要素数指定された要素数(指定がなければ要素数 0)の配列を生成する。Array インスタンス
from(array[, mapFn[, thisArg]])配列、関数、this 値「指定された配列」から「関数」を利用して新しい配列を生成する。
「関数」は「指定された配列」のすべての要素に適用され新しい値が求められる。
そのとき、関数内では 「this 値」として渡された値を this オブジェクトとして利用できる。
また、Array.from(obj).map(mapFn, thisArg) と同じ結果となる。
Array インスタンス
記述例
<span id="d1"></span> <span id="d11"></span>  <!-- 途中略 --> <span id="d13"></span><br>
<!-- 以下略 -->

<script>
function set(array, label) {
  for (var i = 0 ; i < array.length ; i++) {
    document.getElementById(label+(i+1)).textContent=array[i];
  }
}
var a = Array.of(1, 2, 3);
set(a, "d1");    // 1, 2, 3
let b = Array.of("one", "two", "three");
set(b, "d2");    // "one", "two", "three"

let c = Array.from(a);
set(c, "d3");    // 1, 2, 3
let d = Array.from("abc");
set(d, "d4");    // "a", "b", "c"
let e = Array.from([1,2,3], function(x){return x*10});
set(e, "d5");    // 10, 20, 30
</script>

生成された配列の各要素を表示しています。

最後の例は、元の配列の要素の10倍した値を持った新しい配列が生成されています。

実行例

(1-2)検査

メソッド引数機能戻り値
isArray(obj)インスタンスインスタンスが配列かどうかを返す。配列であれば true、そうでなければ false
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
document.getElementById("d1").textContent=Array.isArray([]);            // true
document.getElementById("d2").textContent=Array.isArray(new Array);     // true
document.getElementById("d3").textContent=Array.isArray();              // false
document.getElementById("d4").textContent=Array.isArray(0);             // false
</script>
実行例

9.5.2  Array インスタンス

Array インスタンスの持つプロパティとメソッドについて説明します。

(1) インスタンス生成

new Array([number])

指定された要素数の配列を生成する。

引数 number:要素数

戻り値:Array インスタンス


new Array([value[, value[, ...]]])

指定された初期値を持つ配列を生成する。

整数が一つだけだと要素数と判断されるので、その場合は Array.of を使用する。

引数 value:初期値

戻り値:Array インスタンス

記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
let a = new Array();
document.getElementById("d1").textContent=a.length;    // 0
let b = new Array(3);
document.getElementById("d2").textContent=b.length;    // 3
let c = new Array("one", "two", "three");
document.getElementById("d3").textContent=c.length;    // 3
let d = ["one", "two", "three"];
document.getElementById("d4").textContent=d.length;    // 3
</script>

要素数を表示しています。また、最後の例のように記述しても配列が生成されます。

実行例

(2) インスタンス・メソッド

Array インスタンスの主なメソッドについて説明します。一般的なオブジェクト指向言語の「インスタンスメソッド」の意味合いです。

(2-1)新配列生成

配列に他の配列や値を追加したり、一部を取り出したりして、新しい配列を生成します。

メソッド引数機能戻り値
concat(value[,value[, ...]])配列に値をつないでできた新しい配列を返す。配列
concat(array[,array[, ...]])配列配列に他の配列をつないでできた新しい配列を返す。配列
slice(start[,end])開始位置、
終了位置規定値:配列要素数
(開始位置、終了位置が負の場合は、
配列要素数+開始位置、配列要素数+終了位置となる。)
配列中の開始位置から終了位置の前までの要素を取り出して、新しい配列を生成する。配列
記述例
<span id="d11"></span> <!-- 途中略 --> <span id="d15"></span><br>
<!-- 以下略 -->

<script>
function set(array, label) {
  for (let i = 0 ; i < array.length ; i++) {
    document.getElementById(label+(i+1)).textContent=array[i];
  }
}
let arr = ["a", "b"];
let a1 = arr.concat(1, 2, 3);      // a b 1 2 3
set(a1, "d1");
let a2 = arr.concat([1, 2, 3]);    // a b 1 2 3
set(a2, "d2");
let a3 = arr.concat([1], [2, 3]);  // a b 1 2 3
set(arr, "d3");

let a4 = a3.slice(2);              // 1 2 3
set(a4, "d4");
let a5 = a3.slice(1, 3);           // b 1
set(a5, "d5");
let a6 = a3.slice(-5, -3);         // a b
set(a6, "d6");
</script>

concat は元の配列に要素が追加された新しい配列が作られます(元の配列は変更ありません)が、push と unshift は元の配列が変更されます。

実行例

(2-2)イテレータ(Iterator)

イテレータとは、一連の処理中において現在の処理位置を把握しつつ、コレクション中のアイテムへ一つずつアクセスする方法を備えたオブジェクトのことです。

メソッド引数機能戻り値
entries()なし配列内の各要素に対する key と value のペアを含む新しい Iterator インスタンスを返す。Iterator インスタンス
keys()なし配列内の各要素に対する key を含む新しい Iterator インスタンスを返す。Iterator インスタンス
values()なし配列内の各要素に対する value を含む新しい Iterator インスタンスを返す。Iterator インスタンス
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
let arr = ['a', 'b', 'c'];
let eArr = arr.entries();    // [0,a] [1,b] [2,c]
let i = 1;
for (let e of eArr) {
  document.getElementById("d1" + i++).textContent="[" + e[0] + "," + e[1] + "]";
}
eArr = arr.keys();           // 0 1 2
i = 1;
for (let e of eArr) {
  document.getElementById("d2" + i++).textContent=e;
}
eArr = arr.values();         // a b c
i = 1;
for (let e of eArr) {
  document.getElementById("d3" + i++).textContent=e;
}
</script>

実行例

(2-3)要素の値設定

配列中の開始位置から終了位置の前までの要素に、指定した値を設定します。

メソッド引数機能戻り値
fill(value[,start[,end]])値、
開始位置、規定値:0
終了位置規定値:配列要素数
(開始位置、終了位置が負の場合は、
配列要素数+開始位置、配列要素数+終了位置となる。)
配列中の開始位置から終了位置の前までの要素に、指定した値を設定する。なし
記述例
<span id="d11"></span> <!-- 途中略 --> <span id="d15"></span><br>
<!-- 以下略 -->

<script>
function set(array, label) {
  for (let i = 0 ; i < array.length ; i++) {
    document.getElementById(label+(i+1)).textContent=array[i];
  }
}
let arr = [1, 2, 3, 4, 5];
arr.fill(0);                    // 0 0 0 0 0
set(arr, "d1");
arr = [1, 2, 3, 4, 5];
arr.fill(0, 3);                 // 1 2 3 0 0
set(arr, "d2");
arr = [1, 2, 3, 4, 5];
arr.fill(0, 2, 4);              // 1 2 0 0 5
set(arr, "d3");
arr = [1, 2, 3, 4, 5];
arr.fill(0, -2, -1);            // 1 2 3 0 5
set(arr, "d4");
</script>
実行例

(2-4)要素の追加・削除

配列に他の配列や値を追加します。

メソッド引数機能戻り値
push(value[,value[, ...]])配列の最後に値を追加する。要素数
unshift(value[,value[, ...]])配列の最初に値を追加する。要素数
pop()なし配列の最後から要素を取り除き、その要素の値を返す。要素の値
shift()なし配列の最初から要素を取り除き、その要素の値を返す。要素の値
記述例
<span id="d11"></span> <!-- 途中略 --> <span id="d15"></span><br>
<!-- 以下略 -->

<script>
function set(array, label) {
  for (let i = 0 ; i < array.length ; i++) {
    document.getElementById(label+(i+1)).textContent=array[i];
  }
}
let a1 = ["a", "b"];
let l1 = a1.push(1, 2, 3);                    // a b 1 2 3
set(a1, "d1");
let a2 = ["a", "b"];
let l2 = a2.unshift(1, 2, 3);                 // 1 2 3 a b
set(a2, "d2");
let i1 = a1.pop();                            // a b 1 2
set(a1, "d3");
document.getElementById("d35").textContent="(" + i1 + ")";     // (3)
let l2 = a1.shift();                          // b 1 2
set(a1, "d4");
document.getElementById("d45").textContent="(" + i2 + ")";     // (a)
</script>

最後の2つは取り除いた要素を最後に "()" に囲って表示しています。

実行例

(2-5)置換

配列に他の配列や値をつないでできた新しい配列を返します。

メソッド引数機能戻り値
splice(index, howMany, [value[,value[, ...]]])開始位置、削除数、値 ...開始位置から削除数分削除し、そこに値を追加した新しい配列を返す。削除された要素を含む配列
copyWithin(target, start, [end])転記先、開始位置、
終了位置規定値:配列要素数
(開始位置、終了位置が負の場合は、
配列要素数+開始位置、配列要素数+終了位置となる。)
開始位置から終了位置の前までの要素を転記先にコピーする。なし
記述例
<span id="d11"></span> <!-- 途中略 --> <span id="d15"></span><br>
<!-- 以下略 -->

<script>
function set(array, label) {
  for (let i = 0 ; i < array.length ; i++) {
    document.getElementById(label+(i+1)).textContent=array[i];
  }
}
let a1 = ["a", "b"];
let r1 = a1.splice(1, 0, "x");                // a x b
set(a1, "d1");
document.getElementById("d15").textContent="(" + r1 + ")";  // ()
let r2 = a1.splice([1, 2, "b", "c"]);         // a b c
set(a1, "d2");
document.getElementById("d25").textContent="(" + r2 + ")";  // (x,b)

let a2 = [1, 2, 3, 4, 5];
a2.copyWithin(0, 3);                          // 4 5 3 4 5
set(a2, "d3");
a2 = [1, 2, 3, 4, 5];
a2.copyWithin(1, 3, 5);                       // 1 4 5 4 5
set(a2, "d4");
</script>

前の2つは、取り除いた要素を最後に "()" に囲って表示しています。

実行例

(2-6)並べ替え

配列の要素を並べ替えます。

メソッド引数機能戻り値
sort([compareFunction])ソート順を定義する関数配列の要素を指定された関数の返り値に従ってソートする。(関数が指定されていない場合は文字順)ソートされた配列
reverse()なし配列の要素を反転させる。なし
記述例
<span id="d11"></span> <!-- 途中略 --> <span id="d15"></span><br>
<!-- 以下略 -->

<script>
function set(array, label) {
  for (let i = 0 ; i < array.length ; i++) {
    document.getElementById(label+(i+1)).textContent=array[i];
  }
}
// a < b  : -1
// a == b : 0
// a > b  : 1
function  compare(a, b) {
  return a < b ? -1 : (a == b ? 0 : 1);    // 昇順
}

let a1 = [5, 4, 3, 2, 1];
a1.sort();           // 1 2 3 4 5
set(a1, "d1");
a1 = ["e", "d", "c", "b", "a"];
a1.sort(compare);    // a b c d e
set(a1, "d2");

a1.reverse();        // e d c b a
set(a1, "d3");
</script>
実行例

(2-7)検査

配列の要素を指定された関数によって検査します。

メソッド引数機能戻り値
every(callback[, thisObject])テスト関数、this として使用するインスタンス与えられた関数によって実行されるテストに配列のすべての要素が合格するかどうかをテストする。全ての要素が合格のとき true、そうでなければ false
filter(callback[, thisObject])テスト関数、this として使用するインスタンス与えられた関数が true を返した要素からなる新しい配列を返す。与えられた関数が true を返す要素からなる配列
find(callback[, thisObject])テスト関数、this として使用するインスタンス与えられた関数が true を返した要素の値を返す。与えられた関数が true を返す要素があればその値、なければ undefined
findIndex(callback[, thisObject])テスト関数、this として使用するインスタンス与えられた関数が true を返した要素のインデックスを返す。与えられた関数が true を返す要素があればそのインデックス、なければ -1
some(callback[, thisObject])テスト関数、this として使用するインスタンス与えられた関数によって実行されるテストに合格する要素があるかどうかをテストする。合格する要素があれば true、なければ false

各メソッドから呼び出される callback 関数は次のような仕様です。

function 関数名(element, index, array)

要素ごとに合格しているかどうかを検査する。

引数 element:要素の値

引数 index:要素のインデックス

引数 array:検査されている Array インスタンス

戻り値:検査に合格したのなら true、そうでないなら false

記述例
<span id="d01"></span><span id="d02"></span><br>
<!-- 以下略 -->

<script>
function isPositive(element, index, array) {
  return (element > 0);
}
document.getElementById("d01").textContent=[5, 7, 3, 4, 2].every(isPositive);   // true
document.getElementById("d02").textContent=[5, 7, -2, 4, 2].every(isPositive);  // false

document.getElementById("d11").textContent="[" + [5, 7, -2, 4, 2].filter(isPositive) + "]";      // [5,7,4,2]
document.getElementById("d12").textContent="[" + [-5, -7, -2, -4, -2].filter(isPositive) + "]";  // []

document.getElementById("d21").textContent=[-5, -7, 3, -4, -2].find(isPositive);   // 3
document.getElementById("d22").textContent=[-5, -7, -2, -4, -2].find(isPositive) == undefined ? "undefined" : "";  // undefined

document.getElementById("d31").textContent=[-5, -7, 3, -4, -2].findIndex(isPositive);   // 2
document.getElementById("d32").textContent=[-5, -7, -2, -4, -2].findIndex(isPositive);  // -1

document.getElementById("d41").textContent=[-5, -7, 3, -4, -2].some(isPositive);   // true
document.getElementById("d42").textContent=[-5, -7, -2, -4, -2].some(isPositive);  // false
</script>
実行例

(2-8)各要素に対する順次処理

配列の各要素に対して指定された関数を実行します。ただし、配列の要素は変更しません。処理結果によって配列とは別のインスタンスを変更したり、新たな配列インスタンスを生成したりします。

メソッド引数機能戻り値
forEach(callback[, thisObject])処理関数、this として使用するインスタンス与えられた関数を配列のすべての要素に対して実行する。なし
map(callback[, thisObject])テスト関数、this として使用するインスタンス与えられた関数を配列のすべての要素に対して実行し、その結果からなる新しい配列を返す。新しい配列

各メソッドから呼び出される callback 関数は次のような仕様です。

function 関数名(element, index, array)

要素ごとに合格しているかどうかを検査する。

引数 element:要素の値

引数 index:要素のインデックス

引数 array:検査されている Array インスタンス

戻り値:要素の値

記述例
<div id="d1"></div>
<div id="d2"></div>

<script>
function calculate(element, index, array) {
  this[0] += element;
  this[1] *= element;
}
function twice(element, index, array) {
  return element + element;
}
let result = [0, 1];  // [和,積]
[5, 7, 3, 4, 2].forEach(calculate, result);
document.getElementById("d1").textContent="[" + result + "]";   // [21,840]

document.getElementById("d2").textContent="[" + [5, 7, -2, 4, 2].map(twice) + "]";      // [10,14,-4,8,4]
</script>
実行例

(2-9)全要素から処理

配列の各要素に対して指定された関数を実行します。ただし、配列の要素は変更しません。各要素に順に処理した単一の結果を返します。

メソッド引数機能戻り値
reduce(callback[, initialValue])処理関数、初めて callback 関数が呼ばれるときの previousValue配列の各要素と前回の演算結果に対して(左から右へ)順次関数を適用し、単一の値にする。
reduceRight(callback[, initialValue])処理関数、初めて callback 関数が呼ばれるときの previousValue配列の各要素と前回の演算結果に対して(右から左へ)同時に関数を適用し、単一の値にする。

各メソッドから呼び出される callback 関数は次のような仕様です。

function 関数名(previousValue, currentValue, index, array)

要素ごとに合格しているかどうかを検査する。

引数 previousValue:初回は initialValue が指定されていれば initialValue、なければ 1つ目の要素
               2回目以降は、前回の演算結果

引数 currentValue:初回は initialValue が指定されていれば1つ目の要素、なければ 2つ目の要素
               2回目以降は、前回の次の要素

引数 index:要素のインデックス

引数 array:検査されている Array インスタンス

戻り値:全ての要素に演算した結果

記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
function calculate(previousValue, currentValue, index, array) {
  return previousValue - currentValue;
}
document.getElementById("d1").textContent=[1, 2, 3, 4, 5].reduce(calculate);            // -13
document.getElementById("d2").textContent=[1, 2, 3, 4, 5].reduce(calculate, 6);         // -9

document.getElementById("d3").textContent=[1, 2, 3, 4, 5].reduceRight(calculate);       // -5
document.getElementById("d4").textContent=[1, 2, 3, 4, 5].reduceRight(calculate, 6);    // -9
</script>

一つ目は、((((1 - 2) - 3) - 4) - 5) → -13

二つ目は、(((((6 - 1) - 2) - 3) - 4) -5) → -9

三つ目は、((((5 - 4) - 3) - 2) - 1) → -5

四つ目は、(((((6 - 5) - 4) - 3) - 2) - 1) → -9

実行例

(2-10)検索

配列の要素を検索します。

メソッド引数機能戻り値
includes(searchElement[, fromIndex])検索する値、開始位置規定値:0与えられた値が配列に含まれているかどうかを開始位置から後ろに向かって検索する。開始位置が負ならば配列要素数+開始位置から検索する。あれば true、なければ false
indexOf(searchElement[, fromIndex])検索する値、開始位置規定値:0与えられた値が配列に含まれているかどうかを開始位置から後ろに向かって検索する。開始位置が負ならば配列要素数+開始位置から検索する。見つかればその最初の位置、なければ -1
lastIndexOf(searchElement[, fromIndex])検索する値、開始位置規定値:配列要素数与えられた値が配列に含まれているかどうかを開始位置の前から前に向かって検索する。開始位置が負ならば配列要素数+開始位置から検索する。見つかればその最初の位置、なければ -1
記述例
<span id="d01"></span><span id="d02"></span><span id="d03"></span><br>
<!-- 以下略 -->

<script>
document.getElementById("d01").textContent=[5, 4, 3, 2, 4].includes(4);        // true
document.getElementById("d02").textContent=[5, 4, 3, 2, 4].includes(4, 2);     // true
document.getElementById("d03").textContent=[5, 4, 3, 2, 4].includes(5, -3);    // false

document.getElementById("d11").textContent=[5, 4, 3, 2, 4].indexOf(4);         // 1
document.getElementById("d12").textContent=[5, 4, 3, 2, 4].indexOf(4, 2);      // 4
document.getElementById("d13").textContent=[5, 4, 3, 2, 4].indexOf(5, -3);     // -1

document.getElementById("d21").textContent=[5, 4, 3, 2, 4].lastIndexOf(4);     // 4
document.getElementById("d22").textContent=[5, 4, 3, 2, 4].lastIndexOf(4, 2);  // 1
document.getElementById("d23").textContent=[5, 4, 3, 2, 4].lastIndexOf(2, -3); // -1
</script>
実行例

(2-11)文字列

配列の要素をつないで文字列にします。

メソッド引数機能戻り値
join([separator])区切り文字規定値:","配列のすべての要素を区切り文字でつないで文字列にする。文字列
toLocaleString()なし配列の要素を表す文字列を返す。要素は、toLocaleString メソッドを使用して文字列に変換され、ロケール固有の文字列で連結される。文字列
toString()なし配列の要素を表す文字列を返す。要素は、toString メソッドを使用して文字列に変換され、"," で連結される。文字列
記述例
<div id="d01"></div>
<!-- 以下略 -->

<script>
document.getElementById("d01").textContent=[1, 2, 3, 4, 5].join();                     // 1,2,3,4,5
document.getElementById("d02").textContent=["サゴシ", "コハダ", "サワラ"].join("->");   // サゴシ->コハダ->サワラ

document.getElementById("d11").textContent=[new Date(), Date.now()].toLocaleString();  // yyyy年mm月dd日 hh:mm:ss, ...(略)
document.getElementById("d12").textContent=[new Date(), Date.now()].toString();        // アメリカ英語式日時文字列
</script>
実行例

9.6  連想配列(Map)

Map オブジェクトは、キーと値をペアで持つ配列オブジェクトです。

キーと値は、任意の型になります。既存のキーを使用して値を追加する場合、新しい値は元の値を置き換えます。

9.6.1  Map インスタンス

Map インスタンスの持つプロパティとメソッドについて説明します。

(1) インスタンス生成

new Map([iterable])

指定された要素の連想配列を生成する。

引数 iterable:キー・値の対(2 要素の配列)の Array など

戻り値:Map インスタンス


記述例
<div id="d1"></div>
<div id="d2"></div>

<script>
let mapA = new Map();
document.getElementById("d1").textContent=mapA.size;                     // 0
let mapB = new Map([['犬', 'dog'], ['猫', 'cat'], ['山羊', 'goat']]);
document.getElementById("d2").textContent=mapB.size;                     // 3
</script>

要素数を表示しています。

実行例

(2) インスタンス・プロパティ

Map インスタンスの主なプロパティについて説明します。

プロパティ
sizeR/O連想配列の要素数
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
let map = new Map();
document.getElementById("d1").textContent=map.size;                     // 0
map.set('犬', 'dog');
document.getElementById("d2").textContent=map.size;                     // 1
map.set('猫', 'cat');
document.getElementById("d3").textContent=map.size;                     // 2
</script>

要素数を表示しています。

実行例

(3) インスタンス・メソッド

Map インスタンスの主なメソッドについて説明します。

(3-1)イテレータ(Iterator)

イテレータとは、一連の処理中において現在の処理位置を把握しつつ、コレクション中のアイテムへ一つずつアクセスする方法を備えたオブジェクトのことです。

メソッド引数機能戻り値
entries()なし連想配列内の各要素に対する key と value のペアを含む新しい Iterator インスタンスを返す。Iterator インスタンス
keys()なし連想配列内の各要素に対する key を含む新しい Iterator インスタンスを返す。Iterator インスタンス
values()なし連想配列内の各要素に対する value を含む新しい Iterator インスタンスを返す。Iterator インスタンス
記述例
<div id="d11"></div><div id="d12"></div><div id="d13"></div>
<!-- 以下略 -->

<script>
let map = new Map();
map.set('a', 10);
map.set('b', 100);
map.set('c', 50);
let eMap = map.entries();    // [a,10] [b,100] [c,50]
let i = 1;
for (let e of eMap) {
  document.getElementById("d1" + i++).textContent="[" + e[0] + "," + e[1] + "]";
}
eMap = map.keys();           // a b c
i = 1;
for (let e of eMap) {
  document.getElementById("d2" + i++).textContent=e;
}
eMap = map.values();         // 10 100 50
i = 1;
for (let e of eMap) {
  document.getElementById("d3" + i++).textContent=e;
}
</script>

実行例

(3-2)要素追加

指定された key と value を追加します。キーあるいは値として任意の値(インスタンス、プリミティブ値とも)を使うことができます。

メソッド引数機能戻り値
set(key, value)キー、値指定された key と value を追加する。Map インスタンス
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
let map = new Map();
document.getElementById("d1").textContent=map.size;                     // 0
map.set('猫', 'cat');
map.set([1, 2], [100, 200, 300]);
let x = {a: 1};
map.set(x, {x:100, y:200});
map.set(1, 100);
document.getElementById("d2").textContent=map.size;                     // 4
map.set(1, 999);                     // 同じ 1 というキーで set する
document.getElementById("d3").textContent=map.size;                     // 4(要素数は増えない)
map.set([1, 2], [1]);                // 同じ [1, 2] というキーで set する
document.getElementById("d4").textContent=map.size;                     // 5(要素数が増える)
map.set(x, {});                      // 同じ {a: 1} というキーで set する
document.getElementById("d5").textContent=map.size;                     // 5(要素数は増えない)
</script>

要素数を表示しています。

set で新しい要素を追加します。ただし、同じキーを指定した場合は追加ではなく、値の更新になります。

map.set(1, 999); では、キー 1 の値を 100 から 999 にするだけなので、要素数は増えません。

しかし、map.set([1, 2], [1]); では、要素数が 4 から 5 に増えています。これは、同じ [1, 2] でもインスタンスが異なるため違うキーと判断されるからです。

map.set(x, {}); のようにインスタンスを変数に代入して行えば、もちろん同じインスタンスなので何度 set を実行しても要素数が増えることはありません。

実行例

(3-3)要素取得

指定された key で保存されている value を取得します。

メソッド引数機能戻り値
get(key)キー指定された key で保存されている value を取得する。
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
let map = new Map();
let x = {a: 1};
map.set('猫', 'cat');
map.set(1, 100);
map.set(1, 999);
map.set([1, 2], [100, 200, 300]);
map.set(x, {x:100, y:200});
document.getElementById("d1").textContent=map.get('猫');                            // cat
document.getElementById("d2").textContent=map.get(1);                               // 999
document.getElementById("d3").textContent=map.get([1, 2])==undefined;               // true
document.getElementById("d4").textContent="x:" + map.get(x).x + " y:" + map.get(x).y; // x:100 y:200
document.getElementById("d5").textContent=map.get('x')==undefined;                  // true
</script>

指定したキーの値を取り出します。同じキーで何回も set している場合は最後の値が取り出されます。キーが見つからなければ、undefined になります。

そのため、[1, 2] というキーは、値としては同じですがインスタンスが異なるため、undefined となります。

変数に入れたインスタンスで set と get をする場合は、もちろん同じインスタンスなので値を取得できます。

実行例

(3-4)検査

指定された key で保存されている value があるかどうかを検査します。

メソッド引数機能戻り値
has(key)キー指定された key で保存されている value があるかどうかを検査する。あれば true、なければ false
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
let map = new Map();
let x = {a: 1};
map.set('猫', 'cat');
map.set(1, 100);
map.set([1, 2], [100, 200, 300]);
map.set(x, {x:100, y:200});
document.getElementById("d1").textContent=map.has('猫');                 // true
document.getElementById("d2").textContent=map.has(1);                    // true
document.getElementById("d3").textContent=map.has([1, 2]);               // false
document.getElementById("d4").textContent=map.has(x);                    // true
document.getElementById("d5").textContent=map.has('x');                  // false
</script>

指定したキーで保存された値があるかどうか検査します。存在している場合は true に、存在していなければ、false になります。

そのため、[1, 2] というキーは、値としては同じですがインスタンスが異なるため、false となります。

変数に入れたインスタンスの場合は、もちろん同じインスタンスなので true になります。

実行例

(3-5)各要素に対する順次処理

連想配列の各要素に対して指定された関数を実行します。ただし、配列の要素は変更しません。処理結果によって配列とは別のオブジェクトを変更したりします。

メソッド引数機能戻り値
forEach(callback[, thisObject])処理関数、this として使用するインスタンス与えられた関数を配列のすべての要素に対して実行する。なし

各メソッドから呼び出される callback 関数は次のような仕様です。

function 関数名(value, key, map)

要素ごとに合格しているかどうかを検査する。

引数 value:要素の値

引数 key:要素のキー

引数 map:検査されている Map インスタンス

戻り値:なし

記述例
<span id="d1"></span><span id="d2"></span><span id="d3"></span>

<script>
function add(value, key, map) {
  this[key] += value;
}
let result = {'a':0, 'b':0, 'c':0};
let mapA = new Map();
mapA.set('a', 10);
mapA.set('b', 100);
let mapB = new Map();
mapB.set('a', 10);
mapB.set('c', 50);
mapA.forEach(add, result);
mapB.forEach(add, result);
document.getElementById("d1").textContent=result.a;   // 20
document.getElementById("d2").textContent=result.b;   // 100
document.getElementById("d3").textContent=result.c;   // 50
</script>

mapA.forEach では、result の a と b にそれぞれ 10 と 100 が加えられ、mapB.forEach では、result の a と c にそれぞれ 10 と 50 が加えられます。

実行例

(3-6)要素削除

連想配列の要素を削除します。

メソッド引数機能戻り値
clear()なしすべての要素を削除する。なし
delete(key)削除する要素のキー指定された要素を削除する。なし
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
function disp(value, key, map) {
  this[0] += "[" + key + "," + value + "]";
}
let s = [""];
let map = new Map();
map.set('a', 10);
map.set('b', 100);
map.set('c', 50);
map.forEach(disp, s);
document.getElementById("d1").textContent="[" + s[0] + "]";   // [[a,10][b,100][c,50]]
map.delete('b');
s[0] = "";
document.getElementById("d2").textContent="[" + s[0] + "]";   // [[a,10][c,50]]
map.clear();
s[0] = "";
document.getElementById("d3").textContent="[" + s[0] + "]";   // []
</script>
実行例

9.7  固有値配列(Set)

Set オブジェクトは、ユニークな値を持つ配列オブジェクトです。同じ値を持つことはできません。

同じ値は追加しても無視されます。

9.7.1  Set インスタンス

Set インスタンスの持つプロパティとメソッドについて説明します。

(1) インスタンス生成

new Set([iterable])

指定された要素の配列を生成する。

引数 iterable:値の設定された Array など

戻り値:Set インスタンス


記述例
<div id="d1"></div>
<div id="d2"></div>

<script>
let setA = new Set();
document.getElementById("d1").textContent=setA.size;                     // 0
let setB = new Set(['犬', '猫', '山羊', '猫']);
document.getElementById("d2").textContent=setB.size;                     // 3
</script>

要素数を表示しています。Set インスタンスは同じ値を持てませんので、2つ目の '猫' は追加されません。

実行例

(2) インスタンス・プロパティ

Set インスタンスの主なプロパティについて説明します。

プロパティ
sizeR/O固有値配列の要素数
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
let set = new Set();
document.getElementById("d1").textContent=set.size;                     // 0
set.add('犬');
document.getElementById("d2").textContent=set.size;                     // 1
set.add('猫');
document.getElementById("d3").textContent=set.size;                     // 2
</script>

要素数を表示しています。

実行例

(3) インスタンス・メソッド

Set インスタンスの主なメソッドについて説明します。

(3-1)イテレータ(Iterator)

イテレータとは、一連の処理中において現在の処理位置を把握しつつ、コレクション中のアイテムへ一つずつアクセスする方法を備えたインスタンスのことです。

メソッド引数機能戻り値
entries()なし配列内の各要素に対する [value, value] という配列を含む新しい Iterator インスタンスを返す。Iterator インスタンス
values()なし配列内の各要素に対する value を含む新しい Iterator インスタンスを返す。Iterator インスタンス
記述例
<div id="d1"></div>
<div id="d2"></div>

<script>
let set = new Set();
set.add('a');
set.add('b');
set.add('c');
let eSet = set.entries();    // [a,a] [b,b] [c,c]
let i = 1;
for (let e of eSet) {
  document.getElementById("d1" + i++).textContent="[" + e[0] + "," + e[1] + "]";
}
eSet = set.values();         // a b c
i = 1;
for (let e of eSet) {
  document.getElementById("d2" + i++).textContent=e;
}
</script>

実行例

(3-2)要素追加

指定された value を追加します。値として任意の値(インスタンス、プリミティブ値とも)を使うことができます。

また、Set インスタンスは同じ値を持てませんので、同じ値を追加しようとしても無視されます。

メソッド引数機能戻り値
add(value)指定された value を追加する。Set インスタンス
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
let set = new Set();
document.getElementById("d1").textContent=set.size;                     // 0
set.add('猫');
set.add([1, 2]);
let x = {a: 1};
set.add(x);
set.add(1);
document.getElementById("d2").textContent=set.size;                     // 4
set.add(1);                     // 同じ 1 というキーで set する
document.getElementById("d3").textContent=set.size;                     // 4(要素数は増えない)
set.add([1, 2]);                // 同じ [1, 2] というキーで set する
document.getElementById("d4").textContent=set.size;                     // 5(要素数が増える)
set.add(x);                      // 同じ {a: 1} というキーで set する
document.getElementById("d5").textContent=set.size;                     // 5(要素数は増えない)
</script>

要素数を表示しています。

add で新しい要素を追加します。ただし、同じキーを指定した場合は無視されます。

set.add(1); では無視されるので、要素数は増えません。

しかし、set.add([1, 2]); では、要素数が 4 から 5 に増えています。これは、同じ [1, 2] でもインスタンスが異なるため違う値と判断されるからです。

set.set(x); のようにインスタンスを変数に代入して行えば、もちろん同じインスタンスなので何度 add を実行しても要素数が増えることはありません。

実行例

(3-3)検査

指定された value があるかどうかを検査します。

メソッド引数機能戻り値
has(value)指定された value があるかどうかを検査する。あれば true、なければ false
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
let set = new Set();
let x = {a: 1};
set.add('猫');
set.add(1);
set.add([1, 2]);
set.add(x);
document.getElementById("d1").textContent=set.has('猫');                 // true
document.getElementById("d2").textContent=set.has(1);                    // true
document.getElementById("d3").textContent=set.has([1, 2]);               // false
document.getElementById("d4").textContent=set.has(x);                    // true
document.getElementById("d5").textContent=set.has('x');                  // false
</script>

指定したキーで保存された値があるかどうか検査します。存在している場合は true に、存在していなければ、false になります。

そのため、[1, 2] という値は、値としては同じですがインスタンスが異なるため、false となります。

変数に入れたインスタンスの場合は、もちろん同じインスタンスなので true になります。

実行例

(3-4)各要素に対する順次処理

固有値配列の各要素に対して指定された関数を実行します。ただし、配列の要素は変更しません。処理結果によって配列とは別のインスタンスを変更したりします。

メソッド引数機能戻り値
forEach(callback[, thisObject])処理関数、this として使用するインスタンス与えられた関数を配列のすべての要素に対して実行する。なし

各メソッドから呼び出される callback 関数は次のような仕様です。

function 関数名(value1, value2, set)

要素ごとに合格しているかどうかを検査する。

引数 value1:要素の値

引数 value2:要素の値(value1 と同じ値)

引数 set:検査されている Set インスタンス

戻り値:なし

記述例
<div id="d1"></div>

<script>
function count(value1, value2, set) {
  let range = this[0];          // [最小値, 最大値]
  if (value1 >= range[0] && value1 <= range[1])
   this[1]++;    // 件数
}
let result = [[6, 10], 0];      // [[最小値, 最大値], 件数]
let setA = new Set();
setA.add(6);
setA.add(5);
setA.add(10);
setA.add(11);
setA.add(7);
setA.forEach(count, result);    // count 関数内で result が this として扱われる
document.getElementById("d1").textContent=result[1];   // 3
</script>
実行例

(3-5)要素削除

固有値配列の要素を削除します。

メソッド引数機能戻り値
clear()なしすべての要素を削除する。なし
delete(value)削除する要素の値指定された要素を削除する。なし
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
function disp(value1, value2, set) {
  this[0] += value1 + " ";
}
let s = [""];
let set = new Set();
set.add('a');
set.add('b');
set.add('c');
set.forEach(disp, s);    // disp 関数内で s が this として扱われる
document.getElementById("d1").textContent="[" + s[0] + "]";   // [a b c]
set.delete('b');
s[0] = "";
set.forEach(disp, s);    // disp 関数内で s が this として扱われる
document.getElementById("d2").textContent="[" + s[0] + "]";   // [a,c]
set.clear();
s[0] = "";
set.forEach(disp, s);    // disp 関数内で s が this として扱われる
document.getElementById("d3").textContent="[" + s[0] + "]";   // []
</script>
実行例

9.8  弱参照連想配列(WeakMap)

WeakMap オブジェクトは、キーと値をペアで持つ配列オブジェクトです。既存のキーを使用して値を追加する場合、新しい値は元の値を置き換えます。

値は任意の型になりますが、Map オブジェクトと異なり、キーはインスタンスである必要があります。また、キーは他のどこからも参照されない場合、ガベージコレクションの対象になります。

例えば、"文字列" はインスタンスではありません。new String("文字列") がインスタンスです。

9.8.1  WeakMap インスタンス

WeakMap インスタンスの持つプロパティとメソッドについて説明します。

(1) インスタンス生成

new WeakMap([iterable])

指定された要素の弱参照連想配列を生成する。

引数 iterable:キー(インスタンス)・値の対(2 要素の配列)の Array など

戻り値:WeakMap インスタンス


記述例
<div id="d1"></div>
<div id="d2"></div>

<script>
let weakmapA = new WeakMap();
document.getElementById("d1").textContent=weakmapA;                     // [object Object あるいは WeakMap]
let k1 = new Date(2023,6,17);
let k2 = new Date(2023,7,11);
let weakmapB = new WeakMap([[k1, "海の日"], [k2, "山の日"]]);
document.getElementById("d2").textContent=weakmapB.get(k1);             // 海の日
</script>

一つ目はインスタンスを、二つ目は要素を表示しています。

実行例

(2) インスタンス・メソッド

WeakMap インスタンスの主なメソッドについて説明します。

(2-1)要素追加

指定された key と value を追加します。値として任意の値(インスタンス、プリミティブ値とも)を使うことができますが、キーはインスタンスである必要があります。

メソッド引数機能戻り値
set(key, value)キー、値指定された key と value を追加する。WeakMap インスタンス
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
let weakmap = new WeakMap();
let k = new Date(2023,7,11);
weakmap.set(k, "海の日");
document.getElementById("d1").textContent=weakmap.get(k);                     // 海の日
weakmap.set(k, "山の日");
document.getElementById("d2").textContent=weakmap.get(k);                     // 山の日
try {
  weakmap.set("2023/7/11", "山の日");
} catch(e) {
  document.getElementById("d3").textContent=e;                                // (例外が発生する)
}
</script>

要素を取り出して表示しています。

set で新しい要素を追加します。ただし、同じキーを指定した場合は追加ではなく、値の更新になります。

weakmap.set(k, "山の日"); では、値を "海の日" から "山の日" に変更していますので、 "山の日" が表示されます。

しかし、weakmap.set("2023/7/11", "山の日"); では、例外が発生しています。これは、"2023/7/11" がインスタンスではないからです。

実行例

(2-2)要素取得

指定された key で保存されている value を取得します。

メソッド引数機能戻り値
get(key)キー指定された key で保存されている value を取得する。
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
let weakmap = new WeakMap();
let k = new Date(2023,7,11);
weakmap.set(k, "海の日");
weakmap.set(k, "山の日");
document.getElementById("d1").textContent=weakmap.get(k);                                 // 山の日
document.getElementById("d2").textContent=weakmap.get(new Date(2023,7,11))==undefined;   // true
document.getElementById("d3").textContent=weakmap.get(new String(""))==undefined;        // true
</script>

指定したキーの値を取り出します。同じキーで何回も set している場合は最後の値が取り出されます。キーが見つからなければ、undefined になります。

そのため、new Date(2023,7,11) というキーは、値としては同じですがインスタンスが異なるため、undefined となります。

変数に入れたインスタンスで set と get をする場合は、もちろん同じインスタンスなので値を取得できます。

実行例

(2-3)検査

指定された key で保存されている value があるかどうかを検査します。

メソッド引数機能戻り値
has(key)キー指定された key で保存されている value があるかどうかを検査する。あれば true、なければ false
記述例
<script>
let weakmap = new WeakMap();
let k = new Date(2023,7,11);
weakmap.set(k, "山の日");
document.getElementById("d1").textContent=weakmap.has(k);                     // true
document.getElementById("d2").textContent=weakmap.has(new Date(2023,7,11));   // false
document.getElementById("d3").textContent=weakmap.has(new String(""));        // false
</script>

指定したキーで保存された値があるかどうか検査します。存在している場合は true に、存在していなければ、false になります。

そのため、new Date(2023,7,11) というキーは、値としては同じですがインスタンスが異なるため、false となります。

変数に入れたインスタンスの場合は、もちろん同じインスタンスなので true になります。

実行例

(2-4)要素削除

連想配列の要素を削除します。

メソッド引数機能戻り値
delete(key)削除する要素のキー指定された要素を削除する。なし
記述例
<span id="d11"></span><span id="d12"></span><br>
<span id="d21"></span><span id="d22"></span><br>

<script>
let weakmap = new WeakMap();
let k1 = new Date(2023,6,17);
let k2 = new Date(2023,7,11);
weakmap.set(k1, "海の日");
weakmap.set(k2, "山の日");
document.getElementById("d11").textContent=weakmap.get(k1);   // 海の日
document.getElementById("d12").textContent=weakmap.get(k2);   // 山の日
weakmap.delete(k1);
document.getElementById("d21").textContent=weakmap.has(k1);   // false
document.getElementById("d22").textContent=weakmap.get(k2);   // 山の日
</script>

k1 を削除したので、has(k1) では false となります。

clear() 後には k1、k2 とも false となります。

実行例

9.9  弱参照固有値配列(WeakSet)

WeakSet オブジェクトは、ユニークな値を持つ配列オブジェクトです。同じ値を持つことはできません。

同じ値は追加しても無視されます。

値はインスタンスである必要があります。また、他のどこからも参照されない場合、ガベージコレクションの対象になります。

例えば、"文字列" はインスタンスではありません。new String("文字列") がインスタンスです。

9.9.1  WeakSet インスタンス

WeakSet インスタンスの持つプロパティとメソッドについて説明します。

(1) インスタンス生成

new WeakSet([iterable])

指定された要素の配列を生成する。

引数 iterable:値の設定された Array など

戻り値:WeakSet インスタンス


記述例
<div id="d1"></div>
<div id="d2"></div>

<script>
let k1 = new Date(2023,6,17);
let k2 = new Date(2023,7,11);
let weaksetA = new WeakSet();
document.getElementById("d1").textContent=weaksetA;                     // [object WeakSet]
let weaksetB = new WeakSet([k1, k2]);
document.getElementById("d2").textContent=weaksetB.has(k1);             // true
</script>

一つ目はインスタンスを、二つ目は要素が存在するかどうかを表示しています。

実行例

(2) インスタンス・メソッド

WeakSet インスタンスの主なメソッドについて説明します。一般的なオブジェクト指向言語の「インスタンスメソッド」の意味合いです。

(2-1)要素追加

指定されたインスタンスを追加します。

また、WeakSet インスタンスは同じ値を持てませんので、同じ値を追加しようとしても無視されます。

メソッド引数機能戻り値
add(value)指定された value を追加する。Set インスタンス
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
let weakset = new WeakSet();
document.getElementById("d1").textContent=weakset.add(new Date(2023,6,17));       // [object WeakSet]
document.getElementById("d2").textContent=weakset.add(new String("2023/7/17"));   // [object WeakSet]
document.getElementById("d3").textContent=weakset.add("2023/7/17");               // (例外が発生する)
</script>

インスタンスを追加しています。

sweakset.add の引数はインスタンスなければいけないので、文字列を引数にすると例外が発生します。

実行例

(2-2)検査

指定された value があるかどうかを検査します。

メソッド引数機能戻り値
has(value)指定された value があるかどうかを検査する。あれば true、なければ false
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
let weakset = new WeakSet();
let k = new Date(2023,6,17);
weakset.add(k);
document.getElementById("d1").textContent=weakset.has(k);                      // true
document.getElementById("d2").textContent=weakset.has(new Date(2023,6,17));    // false
document.getElementById("d3").textContent=weakset.has("2023/7/17");            // false
</script>

指定したキーで保存された値があるかどうか検査します。存在している場合は true に、存在していなければ、false になります。

そのため、new Date(2023,6,17) という値は、値としては同じですがインスタンスが異なるため、false となります。

変数に入れたインスタンスの場合は、もちろん同じインスタンスなので true になります。

実行例

(2-3)要素削除

弱参照連想配列の要素を削除します。

メソッド引数機能戻り値
delete(value)削除する要素の値指定された要素を削除する。なし
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
let weakset = new WeakSet();
let k = new Date(2023,6,17);
weakset.add(k);
document.getElementById("d1").textContent=weakset.has(k);                      // true
set.delete(k);
document.getElementById("d2").textContent=weakset.has(k);                      // false
weakset.add(k);
set.delete(new Date(2023,6,17));
document.getElementById("d3").textContent=weakset.has(k);                      // true
</script>

指定したインスタンスを削除します。

delete(new Date(2023,6,17)) では、保存されているインスタンスと値は同じですが、インスタンスが異なるので削除されません。よって、true となります。

clear() 後には存在しませんので、false となります。

実行例

9.10  オブジェクト(Object)

Object オブジェクトは、複数の値をまとめたものです。

オブジェクトは、プロパティと呼ばれるもので複数の値や関数をまとめて管理しています。そして各プロパティには名前が付けられています。つまりプロパティはプロパティを区別するための名前と、実際に格納される値や関数を持っています。

オブジェクトを値として記述する場合は、「{」から「}」の中にプロパティ名と値をセットにして「名前:値」「名前:関数」の形式で並べて記述します。複数記述する場合はカンマで区切ります。

記述例
var obj = {width:0, height:0, findArea:function() { return this.width * this.height; } };

なお、関数の中で、自身のプロパティを参照する場合は、this. を付ける必要があります。


オブジェクト外からオブジェクトのプロパティを参照するには、変数名、 「.」に続いてプロパティ名を記述します。プロパティ値の変更も可能です。存在しないプロパティを指定した場合には追加されます。

また、変数名["プロパティ名"] と記述することも可能です。

記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
var obj = {width:0, height:0, findArea:function() { return this.width * this.height; } };
obj.width = 200;           // width の値を変更
obj["height"] = 100;       // height の値を変更
obj.unit = "㎡"            // unit の追加
document.getElementById("d1").textContent=obj["width"];                // 200
document.getElementById("d2").textContent=obj.height;                   // 100
document.getElementById("d3").textContent=obj.findArea() + obj.unit;    // 20000㎡
</script>
実行例

9.10.1  Object オブジェクト

Object オブジェクトの持つプロパティとメソッドについて説明します。

(1) 静的メソッド

Object オブジェクトの主なメソッドについて説明します。一般的なオブジェクト指向言語の「クラスメソッド」の意味合いです。

(1-1)生成

メソッド引数機能戻り値
assign(target, source[, ... source])ターゲット、ソースソースオブジェクトからターゲットオブジェクトへコピーし、そのオブジェクトを返す。Object オブジェクト
create(proto[, propertiesObject])プロトタイプ、プロパティインスタンスプロトタイプにプロパティを追加した新しいオブジェクトを生成する。Object オブジェクト
プロパティオブジェクト
{
  "プロパティ名":ディスクリプタ[, "プロパティ名":ディスクリプタ, ... , "プロパティ名":ディスクリプタ]
}
ディスクリプタ
{
  value : "値",
  writable : true,
  configurable : false,
  enumerable : false,
  get : function(){},
  set : function(){},
}
オプションキー意味既定値
value値(get、set とは同時に指定できない)undefined
writabletrue の場合、値を変更できる(ただし、false でも configurable が true なら値を変更できる)false
configurabletrue の場合、プロパティの削除や writable 以外のプロパティの変更ができるfalse
enumerabletrue の場合、プロパティ列挙に現れる(for...in ループに現れる)false
getvalue から値を得る関数(value とは同時に指定できない)undefined
setvalue に値を設定する関数(value とは同時に指定できない)undefined
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
function disp(obj) {
  var s = "{";
  var k = Object.keys(obj);
  for (var i in k) {
    s += k[i] + ":" + obj[k[i]] + " ";
  }
  return s + "}";
}
var o1 = { a:1 };
var o2 = { b:2 };
var o3 = { c:3 };
var obj;
  obj = Object.assign(o1, o2, o3);
  document.getElementById("d1").textContent=disp(obj);  // { a:1, b:2, c:3 }

  obj = Object.create(null);
  document.getElementById("d2").textContent=disp(obj);  // {}

  obj = Object.create({}, {d : {value:10,enumerable:true}});
  document.getElementById("d3").textContent=disp(obj);  // { d:10 }
</script>

3例目の d は enumerable:true が指定してあります。これが指定されているので、disp 関数の for ... in 命令で列挙されるようになります。

実行例

(1-2)プロパティ定義

メソッド引数機能戻り値
defineProperties(obj, props)ターゲット、プロパティオブジェクトオブジェクトに複数のプロパティを定義、変更して、そのインスタンスを返す。Object オブジェクト
defineProperty(obj, prop, descriptor)ターゲット、プロパティ、ディスクリプタオブジェクトに個別に指定したプロパティを定義、変更して、そのインスタンスを返す。Object オブジェクト
プロパティオブジェクト
{
  "プロパティ名":ディスクリプタ[, "プロパティ名":ディスクリプタ, ... , "プロパティ名":ディスクリプタ]
}
ディスクリプタ
{
  value : "値",
  writable : true,
  configurable : false,
  enumerable : false,
  get : function(){},
  set : function(){},
}
オプションキー意味既定値
value値(get、set とは同時に指定できない)undefined
writabletrue の場合、値を変更できる(ただし、false でも configurable が true なら値を変更できる)false
configurabletrue の場合、プロパティの削除や writable 以外のプロパティの変更ができるfalse
enumerabletrue の場合、プロパティ列挙に現れる(for...in ループに現れる)false
getvalue から値を得る関数(value とは同時に指定できない)undefined
setvalue に値を設定する関数(value とは同時に指定できない)undefined
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
function disp(obj) {
  var s = "{";
  var k = Object.keys(obj);
  for (var i in k) {
    s += k[i] + ":" + obj[k[i]] + " ";
  }
  return s + "}";
}
var obj = {};
Object.defineProperties(obj, {
  "prop1": { value:true, writable:true, enumerable:true },
  "prop2": { value:"Hello", writable:false, enumerable:true }
});
document.getElementById("d1").textContent=disp(obj);  // {prop1:true prop2:Hello }

Object.defineProperties(obj, {
  "prop1": { value:false, writable:true, enumerable:true },
  "prop3": { value: 100, writable:true, enumerable:true }
});
document.getElementById("d2").textContent=disp(obj);  // {prop1:false prop2:Hello prop3:100 }

Object.defineProperty(obj, "prop3", {value:200});
document.getElementById("d3").textContent=disp(obj);  // {prop1:false prop2:Hello prop3:200 }

Object.defineProperty(obj, "prop2", {value:"Good-bye"});
document.getElementById("d4").textContent=disp(obj);  // (例外が発生する)
</script>

最初の例では、prop1 と prop2 を定義しています。

二つ目の例では、prop1 と prop3 を定義していますが、prop1 は既に定義済みで writable:true なので、prop1 が変更になります。

三つ目の例では、prop3 が既に定義済みで writable:true なので、やはり prop3 が変更になります。

最後の例は、prop2 も既に定義済みですが writable:false なので、変更できず例外が発生します。

実行例

(1-3)プロパティ取得

メソッド引数機能戻り値
getOwnPropertyDescriptor(obj, prop)対象オブジェクト、プロパティ名指定されたプロパティをオブジェクトから取り出し、そのディスクリプタを返す。プロパティディスクリプタ
getOwnPropertyNames(obj)対象オブジェクトすべてのプロパティ名 (列挙可能・不可能を問わず) の配列を返す。プロパティ名の配列
keys()対象オブジェクト列挙可能なプロパティ名(key)の配列を返す。プロパティ名の配列
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
function disp(obj) {
  var s = "{";
  var k = Object.keys(obj);
  for (var i in k) {
    s += k[i] + ":" + obj[k[i]] + " ";
  }
  return s + "}";
}
var obj = {};
var arr = ["a", "b", "c"];
var value;
Object.defineProperties(obj, {
  "prop1": { value:"Hello", writable:true, enumerable:false },
  "prop2": { get:function() { return value; }, set:function(v) { value = v; }, enumerable:true }
});

document.getElementById("d1").textContent=disp(Object.getOwnPropertyDescriptor(obj, "prop1"));

document.getElementById("d2").textContent=disp(Object.getOwnPropertyDescriptor(obj, "prop2"));

document.getElementById("d3").textContent=Object.getOwnPropertyNames(obj);

document.getElementById("d4").textContent=Object.getOwnPropertyNames(arr);

document.getElementById("d5").textContent=Object.keys(obj);
</script>

最初の例では、prop1 のプロパティディスクリプタを表示しています。

二つ目の例では、prop2 のプロパティディスクリプタを表示しています。

三つ目の例では、obj のプロパティ名を表示しています。列挙可能・不可能を問わずすべてのプロパティ名が得られます。

四つ目の例では、配列 arr のプロパティ名を表示しています。配列の要素番号がプロパティ名として表示されています。また、最後に length というプロパティがあることがわかります。

最後の例では、三つ目の例と同じく obj のプロパティ名を表示していますが、列挙可能なプロパティ名しか得られません。

実行例

(1-4)変更不可

メソッド引数機能戻り値
freeze(obj)対象オブジェクトプロパティの追加、削除、変更をできなくする。対象オブジェクト
preventExtensions(obj)対象オブジェクト新しいプロパティの追加をできなくする。削除はできる。対象オブジェクト
seal(obj)対象オブジェクトプロパティの追加、削除をできなくする。プロパティの値は、書き込み可能である限り変更できる。対象オブジェクト
記述例
<span id="d11"></span><span id="d12"></span><span id="d13"></span><br>
<span id="d21"></span><span id="d22"></span><br>
<span id="d23"></span><span id="d24"></span><br>
<span id="d31"></span><span id="d32"></span><br>
<span id="d33"></span><span id="d34"></span><br>

<script>
var obj = {};
Object.defineProperties(obj, {
  "prop1": { value:"One", writable:true, enumerable:true },
  "prop2": { value:"Two", writable:true, enumerable:true },
  "prop3": { get: function() { return value; }, set: function(v) { value = v; }, enumerable:true }
});
obj.prop1 = "un";
Object.freeze(obj);  // --------------------------------------------------------------------------------
obj.prop2 = "deux";
obj.prop3 = "trois";
document.getElementById("d11").textContent=obj.prop1;
document.getElementById("d12").textContent=obj.prop2;
document.getElementById("d13").textContent=obj.prop3;

var obj2 = {};
Object.defineProperty(obj2, "prop1", { value: "One", configurable: true });
document.getElementById("d21").textContent=obj2.prop1;
Object.preventExtensions(obj2);  // ----------------------------------------------------------------------
obj2.prop1 = "un";
document.getElementById("d23").textContent=obj2.prop1;
try {
  Object.defineProperty(obj2, "prop2", { value: "Two" });
} catch(e) {document.getElementById("d22").textContent=e;}    // prop2 は freeze の後なので変更できない
delete obj2.prop1;  // 削除できる
document.getElementById("d24").textContent=obj2.prop1;  // 削除されたので、値が表示されない(undefined と表示される)

var obj3 = {};
Object.defineProperty(obj3, "prop1", { value: "One", configurable: true });
document.getElementById("d31").textContent=obj3.prop1;
Object.seal(obj3);  // -----------------------------------------------------------------------------------
obj3.prop1 = "un";
document.getElementById("d33").textContent=obj3.prop1;
try {
  Object.defineProperty(obj3, "prop2", { value: "Two");
} catch(e) {document.getElementById("d32").textContent=e;}    // prop2 は seal の後なので追加できない
delete obj3.prop1;  // 削除できない
document.getElementById("d34").textContent=obj3.prop1;  // 削除できなかったので、元の値が表示される
</script>

最初の例では、prop1 は freeze の前なので値を変更できますが、prop2 は freeze の後なので変更できません。ただし、prop3 のように set では変更できます。

二つ目の例では、prop1 は preventExtensions の前なので追加できますが、prop2 は preventExtensions の後なので追加できません。ただし、値の変更やプロパティの削除はできます。

最後の例では、prop1 は seal の前なので追加できますが、prop2 は seal の後なので追加できません。また、prop1 の削除もできません。ただし、値の変更はできます。

実行例

(1-5)プロトタイプ

メソッド引数機能戻り値
getPrototypeOf(obj)対象オブジェクトオブジェクトのプロトタイプを得る。プロトタイプ
setPrototypeOf(obj, prototype)対象オブジェクト、プロトタイプオブジェクトのプロトタイプを変更する。なし
記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
function disp(obj) {
  var s = "{";
  var k = Object.keys(obj);
  for (var i in k) {
    s += k[i] + ":" + obj[k[i]] + " ";
  }
  return s + "}";
}

var proto1 = {
  "One": "unv",
  "Two": "deux"
};
var proto2 = {
  "One": "eins",
  "Two": "zwei"
};

var obj = Object.create(proto1);
var x = Object.getPrototypeOf(obj);  // ------------------------------------------------
document.getElementById("d1").textContent=disp(x);

Object.setPrototypeOf(obj, proto2);  // ------------------------------------------------
var x = Object.getPrototypeOf(obj);
document.getElementById("d2").textContent=disp(x);
</script>

最初の例は、proto1 をプロトタイプとして obj を生成しています。

二つ目の例は、obj のプロトタイプを proto2 に変更しています。

実行例

(1-6)検査

メソッド引数機能戻り値
is(value1, value2)値、値 2 つの値を比較する。同一ならば true、そうでないならば false
isExtensible(obj)対象オブジェクト拡張可能であるかどうかを調べる。拡張可能ならば true、そうでないならば false
isFrozen(obj)対象オブジェクト設定変更不可で、すべてのプロパティが書き込み不可かどうかを調べる。書き込み不可ならば true、そうでないならば false
isSealed(obj)対象オブジェクト拡張不可で、すべてのプロパティが設定変更不可かどうかを調べる。設定変更不可ならば true、そうでないならば false
記述例
<span id="d11"></span><span id="d12"></span><br>
<!-- 以下略 -->

<script>
var obj1 = {
  "One": "unv",
  "Two": "deux"
};
var obj2 = {
  "One": "unv",
  "Two": "deux"
};

try {
  document.getElementById("d11").textContent=Object.is(obj1, obj2);
  document.getElementById("d12").textContent=Object.is(obj1, obj1);
} catch(e) {document.getElementById("d11").textContent=e;}

try {
  Object.preventExtensions(obj2);  // ------------------------------------------------
  document.getElementById("d21").textContent=Object.isExtensible(obj1);
  document.getElementById("d22").textContent=Object.isExtensible(obj2);
} catch(e) {document.getElementById("d21").textContent=e;}

try {
  Object.freeze(obj2);  // ------------------------------------------------
  document.getElementById("d31").textContent=Object.isFrozen(obj1);
  document.getElementById("d32").textContent=Object.isFrozen(obj2);
} catch(e) {document.getElementById("d31").textContent=e;}

try {
  Object.seal(obj2);  // ------------------------------------------------
  document.getElementById("d41").textContent=Object.isSealed(obj1);
  document.getElementById("d42").textContent=Object.isSealed(obj2);
} catchh(e) {document.getElementById("d41").textContent=e;}
</script>

最初の例では、同じ内容でもインスタンスが異なれば false になることを示しています。

二つ目以降の例では、preventExtensions、freeze や seal を実行していないインスタンスと実行したインスタンスを検査しています。

実行例

9.10.2  Object インスタンス

Object インスタンスの持つプロパティとメソッドについて説明します。

(1) インスタンス生成

new Object([value])

値が null や undefined の場合、空のインスタンスを生成して返します。それ以外の場合、与えられた値に対応する型のインスタンスを返します。値が元々インスタンスだった場合には、その値自体を返します。

引数 value:値

戻り値:Object インスタンス


記述例
<div id="d1"></div>
<div id="d2"></div>

<script>
let objA = new Object();
document.getElementById("d1").textContent=objA;             // [object Object]
let objB = new Object(1);
document.getElementById("d2").textContent=objB;             // 1
</script>
実行例

(2) インスタンス・メソッド

(2-1)検査

メソッド引数機能戻り値
hasOwnProperty(prop)プロパティ名インスタンスの直接のプロパティとして存在しているかどうかを調べる。存在しているならば true、そうでないならば false
propertyIsEnumerable(prop)プロパティ名列挙可能かどうかをを調べる。可能ならば true、そうでないならば false
記述例
<span id="d11"></span><span id="d12"></span><br>
<!-- 以下略 -->

<script>
var obj1 = {
  "One": {value:"unv", enumerable:true },
  "Two": {value:"deux", enumerable:false }
};
document.getElementById("d11").textContent=obj1.hasOwnProperty("One");             // true
document.getElementById("d12").textContent=obj1.hasOwnProperty("Three");           // false

document.getElementById("d21").textContent=obj1.propertyIsEnumerable("One");       // true
document.getElementById("d22").textContent=obj1.propertyIsEnumerable("Two");       // false
document.getElementById("d23").textContent=obj1.propertyIsEnumerable("Three");     // false
</script>

最初の例は、obj1 には One はありますが Three はありません。

二つ目の例では、enumerable は One では true ですが Two では false です。

実行例

(2-2)文字列変換

メソッド引数機能戻り値
toLocaleString()なしtoString() を呼び出す。
(インスタンスの内容を言語やオプションに沿った文字列にして返すためにオーバーライド(上書き)される関数)
インスタンスを表す文字列
toString()なしインスタンスを表した文字列を返す。
(インスタンスの内容を文字列にして返すためにオーバーライド(上書き)される関数)
インスタンスを表した文字列
記述例
<span id="d11"></span><span id="d12"></span><br>
<span id="d21"></span><span id="d22"></span><br>

<script>
var obj = {date:new Date(2023,6,17), event:"海の日"};
document.getElementById("d11").textContent=obj.toLocaleString();     // [object Object]
document.getElementById("d21").textContent=obj.toString();           // [object Object]

Object.prototype.toLocaleString = function() {
  return "{" + this.date.toLocaleDateString() + "," + this.event + "}";
}
Object.prototype.toString = function() {
  return "{" + this.date + "," + this.event + "}";
}

document.getElementById("d12").textContent=obj.toLocaleString(); // {2023年7月17日,海の日}
document.getElementById("d22").textContent=obj.toString();       // {Mon Jul 17 2023 00:00:00 GMT+0900 (日本標準時),海の日}
</script>

どちらの例も、最初は デフォルトの toString 関数などが返す [object Object] が表示されます。

デフォルトの toString に変わる関数を定義した後は、インスタンスの内容を表示しています。

実行例

(2-3)変換

メソッド引数機能戻り値
valueOf()なしインスタンスのプリミティブな値を返す。プリミティブな値
記述例
<span id="d11"></span><span id="d12"></span><br>

<script>
var obj = {date:new Date(2023,6,17), event:"海の日"};
document.getElementById("d11").textContent=obj.valueOf();     // [object Object]

Object.prototype.valueOf = function() {
  return this.date.getTime();
}

document.getElementById("d12").textContent=obj.valueOf();     // 1689519600000
</script>

最初は デフォルトの valueOf 関数などが返す [object Object] が表示されます。

デフォルトの valueOf に変わる関数を定義した後は、インスタンスのプリミティブな値(この例では経過ミリ秒)を表示しています。

実行例

9.11  真偽値(Boolean)

Boolean オブジェクトは、真偽値をオブジェクトとして扱うためのラッパーオブジェクトです。

9.11.1  Boolean インスタンス

Boolean インスタンスの持つプロパティとメソッドについて説明します。

(1) インスタンス生成

new Boolean(value)

Boolean インスタンスを生成する。

value が、0、-0、null、false、NaN、undefined、および空文字("")は false として、その他の値は true の初期値を持つインスタンスを生成します。

引数 value:値

戻り値:Boolean インスタンス

記述例
<div id="d1"></div>
<!-- 以下略 -->

<script>
document.getElementById("d1").textContent=new Boolean();
document.getElementById("d2").textContent=new Boolean(0);
document.getElementById("d3").textContent=new Boolean(-0);
document.getElementById("d4").textContent=new Boolean(null);
document.getElementById("d5").textContent=new Boolean(false);
document.getElementById("d6").textContent=new Boolean(NaN);
document.getElementById("d7").textContent=new Boolean(undefined);
document.getElementById("d8").textContent=new Boolean("");
document.getElementById("d11").textContent=new Boolean(1);
document.getElementById("d12").textContent=new Boolean(true);
document.getElementById("d13").textContent=new Boolean("false");
</script>

Internet Explorer ではすべてが true となります。

実行例

ただし、次の実行例のように表示は正しくないですが、値は正しく設定されているようです。

<div id="d1"></div>
<!-- 以下略 -->

<script>
let f = new Boolean(false);
document.getElementById("d1").textContent=f;
document.getElementById("d2").textContent=(f == false ? "FALSE" : "TRUE");
let t = new Boolean(true);
document.getElementById("d11").textContent=t;
document.getElementById("d12").textContent=(t == true ? "TRUE" : "FALSE");
</script>

2つ目と4つ目は分かりにくいですが、ともに条件が成り立った時に選択される文字列が表示されています。

例えば2つ目は、表示が FALSE ならば、new Boolean(false) の戻り値が false であったということです。

実行例

9.12  エラー(Error)

Error オブジェクトはユーザー定義例外のスーパークラスとして使うこともできます。

また、Error オブジェクトのインスタンスは実行時エラーが発生すると投げられます。Javascript は、次のような例外を発生する可能性があります。

クラス発生する場面
EvalErrorグローバル関数 eval() が不適切に使用された場合
InternalErrorJavaScriptエンジン内部で起きた場合
RangeError関数に対して引数として許容されない範囲の数値を渡そうとした場合
ReferenceError宣言されていない変数を読み出そうとした場合
SyntaxErrorコードをパース中に言語の構文に従わないトークン又はトークン順序に遭遇した場合
TypeErrorある演算子又は関数が期待する型と互換性の無いオペランド又は引数がその関数に渡された場合
URIError奇妙な形のURIに遭遇した場合

9.12.1  Error インスタンス

Error インスタンスの持つプロパティとメソッドについて説明します。

(1)インスタンス生成

エラーインスタンスを生成します。

new Error([message[, fileName[, lineNumber]]])

Error インスタンスを生成する。

引数 message:エラーの説明               規定値:""

引数 fileName:エラーの発生したファイルの名前   規定値:Error を呼び出したファイルの名前

引数 lineNumber:エラーの発生した行番号      規定値:Error を呼び出した行番号

戻り値:Error インスタンス


(2)インスタンス・プロパティ

プロパティ
messageエラーメッセージ
nameエラーインスタンス名
記述例
<span id="d1"></span> <span id="d2"></span>

<script>
try {
  throw new Error("エラー", "xxxx.htm", 10);
}
catch(e) {
  document.getElementById("d1").textContent=e.message;
  document.getElementById("d2").textContent=e.name;
}
</script>

message と name を表示しています。

実行例

(3)インスタンス・メソッド

メソッド引数機能戻り値
toString()なし特定の Error インスタンスを表す文字列を返す。Error インスタンスを表す文字列
記述例
<div id="d1"></div>


<script>
try {
  xxx();      // 未定義
}
catch(e) {
  document.getElementById("d2").textContent=e.toString();
}
</script>

xxx() が宣言されていませんので、例外が発生します。

実行例

9.13  関数(Function)

JavaScript におけるすべての関数は、実際には Function オブジェクトです。

9.13.1  Function インスタンス

Function インスタンスの持つプロパティとメソッドについて説明します。

(1)インスタンス生成

新規の Function インスタンスを生成します。

new Function([arg1[, arg2[, ...argN]],] functionBody)

Function インスタンスを生成する。

引数 arg1~argN:仮引数の名前

引数 functionBody:関数定義


以下の3つの関数(add1、add2、add3)はすべて Function インスタンスです。

記述例
<span id="d11"></span> <span id="d12"></span><br>
<span id="d21"></span> <span id="d22"></span><br>
<span id="d31"></span> <span id="d32"></span><br>
<script>
  var add1 = new Function("a", "b", "return a + b;");
  var add2 = function(a, b) {
    return a + b;
  }
  function add3(a, b) {
    return a + b;
  }
  document.getElementById("d11").textContent=add1(1, 2);
  document.getElementById("d12").textContent=add1 instanceof Function;
  document.getElementById("d21").textContent=add2(1, 2);
  document.getElementById("d22").textContent=add2 instanceof Function;
  document.getElementById("d31").textContent=add3(1, 2);
  document.getElementById("d32").textContent=add3 instanceof Function;
</script>
実行例

(2)インスタンス・プロパティ

プロパティ
caller呼び出し元の関数
length関数が期待する引数の数
name関数の名前
記述例
<span id="d11"></span> <span id="d12"></span><br>
<span id="d21"></span><br>
<span id="d31"></span> <span id="d32"></span> <span id="d33"></span><br>
<script>
  var f1 = function func() {
    return func.caller == null ? "null" : func.caller;
  }
  var f2 = function() {
    return f1();
  }
  var f3 = new Function("a", "b", "return a + b;");

  document.getElementById("d11").textContent=f1();
  document.getElementById("d12").textContent=f2();
  document.getElementById("d21").textContent=f3.length;
  document.getElementById("d31").textContent=f1.name;
  document.getElementById("d32").textContent=f2.name;
  document.getElementById("d33").textContent=f3.name;
</script>

caller の値は、トップレベルから呼び出された場合は null に、関数から呼び出された場合はその関数のコードになります。

name の値は、Function で定義した場合は anonymous、function の後ろに名前が記述されている場合はその名前に、記述されていなければ代入された変数名になります。

実行例

(3)インスタンス・メソッド

メソッド引数機能戻り値
apply(this,valueList)this 参照値、
 関数に渡される引数の配列
与えられた this 参照値と、配列の形で与えられた引数を用いて関数を呼び出す。this 参照値と引数を指定して関数を呼び出した結果
bind(this,value[,value[, ...]])this 参照値、
 関数に渡される引数
与えられた引数を引数とする関数を新しく生成する。生成された関数
call(this,value[,value[, ...]])this 参照値、
 関数に渡される引数
与えられた this 参照値と引数を用いて関数を呼び出す。this 参照値と引数を指定して関数を呼び出した結果

this 参照値がインスタンスではなく null や undefined のときはグローバルオブジェクトである Window インスタンスに置き換わります。なお、this 参照値については、「7.5 this」 を参照してください。

記述例
<span id="d1"></span><br>
<span id="d2"></span><br>
<span id="d3"></span><br>
<script>
  var add = new Function("var sum = 0;for (var i = 0 ; i < arguments.length ; i++) sum += arguments[i]; return sum;");
  document.getElementById("d1").textContent=add.apply(null,[1,2,3]);
  var f = add.bind(null,1,2,3);   // 1,2,3 を引数とする関数を生成
  document.getElementById("d2").textContent=f(4,5);   // add.call(null,1,2,3,4,5) と同じ
  document.getElementById("d3").textContent=add.call(null,1,2,3);
</script>
実行例

9.14  URL(URL)

インターネット上の HTML や画像などといったリソースの場所を特定するためのオブジェクトです。

URL は次のような構造をしています(必要に応じて省略できます)。

[スキーム]://[ホスト]:[ポート][パス][ファイル]?[パラメータ][ハッシュ]

スキーム
通信方式(http、https、ftp など)
ホスト
HTML や画像などを提供する web サーバー(www.foo.co.jp など)
ポート
サービスの種類を特定する番号(20(FTP)、25(SMTP)、80(HTTP)、443(HTTPS) など)
パス
ファイルの存在する場所(/aaa/bbbb/ など)
ファイル
リソースの名前
パラメータ
ファイルに引き渡すパラメータ(?x&y=10 など)
ハッシュ
ファイル内の要素につけられた ID(#entry、#example など)

9.14.1  URL オブジェクト

URL オブジェクトの持つメソッドについて説明します。

(1)静的メソッド

URL.createObjectURL() メソッドは、引数で指定されたオブジェクトを表す URL を含む文字列を生成します。URL の寿命は、それを作成したドキュメントが表示されている間です。

メソッド引数機能戻り値
createObjectURL(object)File、Blob、MediaSourceオブジェクト引数で指定されたオブジェクトを表す URL を含む文字列を生成するURL を含む文字列

記述例
<span id="d1"></span><br>
<script>
var blob = new Blob([JSON.stringify({hello: "world"}, null, 2)], {type : "application/json"});
d1.textContent = URL.createObjectURL(blob);
var file = new File(["foo"], "sample.txt", {type: "text/plain"});
d2.textContent = URL.createObjectURL(file);
var mediaSource = new MediaSource();
d3.textContent = URL.createObjectURL(mediaSource);
</script>
実行例

9.14.2  URL インスタンス

URL オブジェクトの持つメソッドについて説明します。

(1)インスタンス生成

新規の URL インスタンスを生成します。

new URL(url[, base])

引数によって定義された URL を表す新しく生成された URL インスタンスを生成する。

引数 url:リソースの場所を特定する URL

引数 base:url のベースとなるパスを示す文字列 (規定値:"")   (注)

戻り値:URL オブジェクト

(注)URL インスタンスも指定できますが、その場合は、href 属性に設定されている URL が参照されます。

引数の url と base から新しい URL を生成しますが、5つ目の例のように正しくなくてもルートからの URL にしてくれるみたいです。

ちなみに、base の最後の文字が "/" でなければ最後の名前はフォルダではなくファイルと見なされるようです。

記述例
<span id="d01"></span><br>
<!-- 以下略 -->

<script>
var url = new URL("http://foo.co.jp/aaa/111.htm");
d01.textContent = url.href;
url = new URL("/aaa/222.htm", "http://foo.co.jp/xxx/yyy/111.htm");
d02.textContent = url.href;
url = new URL("../bbb/222.htm", "http://foo.co.jp/aaa/yyy/zzz/111.htm");
d03.textContent = url.href;
url = new URL("ccc/222.htm", "http://foo.co.jp/aaa/bbb/111.htm");
d04.textContent = url.href;
url = new URL("../../../bbb/222.htm", "http://foo.co.jp/aaa/xxx/111.htm");
d05.textContent = url.href;

try {
  url = new URL("/bbb/222.htm");
  d11.textContent = url.href;
}
catch(err) {
  d11.textContent = err;
}
try {
  url = new URL("bbb/222.htm", "foo/111.htm");
  d12.textContent = url.href;
}
catch(err) {
  d12.textContent = err;
}
</script>
実行例


(2)インスタンス・プロパティ

プロパティ
originR/Oオリジン(スキーム、ホスト、ポート)
searchParamsR/O引数情報(URLSearchParams オブジェクト)
href完全なアドレス
protocolプロトコル
hostホスト
hostnameホスト:ポート
portポート
pathnameパス
search? 以降に記述されているファイルへの引数
hash# 以降に記述されているファイル内に記述されている ID
記述例
<span id="d01"></span><br>
<!-- 以下略 -->

<script>
var url = new URL("http://foo.co.jp:8080/aaa/111.htm?on&parm=10#entry");
d01.textContent = url.origin;
d02.textContent = url.searchParams;
d03.textContent = url.href;
d04.textContent = url.protocol;
d05.textContent = url.host;
d06.textContent = url.hostname;
d07.textContent = url.port;
d08.textContent = url.pathname;
d09.textContent = url.search;
d10.textContent = url.hash;
</script>
実行例

9.15  通知(Notification)

Web ページからエンドユーザーに表示するシステム通知を制御します。

これらのシステム通知は「アクションセンター」などのブラウザの外に表示されるため、ユーザーがタブを切り替えたり、別のアプリに移動していたとしても表示されます。

注意

使用している Web サーバーのセキュリティ制御により、このページを https://wasika.noor.jp/html/h3/h309/h309.htm で開かないと、通知はできないようです。

9.15.1  Notification オブジェクト

Notification オブジェクトの持つメソッドについて説明します。

(1)静的プロパティ

現在の許可を表す文字列です。

プロパティ
permission現在の許可を表す文字列
grantedシステム通知の表示を明示的に許可
deniedシステム通知の表示を明示的に拒否
default許可、不許可が未決定。この場合、許可が拒否されたかのように実行される

現在の許可状況を表示します。許可の状況が変更になったときの値は次の requestPermission() メソッドの例を参照してください。

記述例
<span id="d1"></span><br>

<script>
d1.textContent = Notification.permission;
</script>
実行例

(2)静的メソッド

Notification.requestPermission() メソッドは、通知を表示できるようにユーザに許可を要求します。

メソッド引数機能戻り値
requestPermission([関数])関数:許可・不許可の選択後に呼び出される関数通知を表示できるようにユーザに許可を要求する(注)許可を求めるダイアログが表示されますが、一度 [許可] か [ブロック] をクリックするとその後は表示されません。なし

メソッドから呼び出される関数は次のような仕様です。

function 関数名(許可)

ユーザーが許可不許可を選んだ時に呼び出される関数。引数に何を選択したかが渡される。

引数 許可:許可の種類(文字列)

granted許可([許可]ボタンのクリック)
denied拒否([ブロック]ボタンのクリック)
default確認(× のクリック)ただし、3回繰り返すと無条件に denied になる

戻り値:なし



次の例は通知の許可・不許可をユーザに問い合わせます。ユーザは「許可」、「ブロック」を選択できます。ただし、一度決定してしまうとダイアログは表示されなくなります。再度ダイアログを表示するには、「確認(デフォルト)」に戻す必要があります。

記述例
<button class="button" onclick="request();">通知の許可</button>
<span id="d1"></span><br>
<button class="button" onclick="permission();">現在の許可</button>
<span id="d2"></span><br>

<script>
function request() { Notification.requestPermission(function(permission) { d1.textContent = permission; }); }
function permission() { d2.textContent = Notification.permission; }); }
</script>
実行例

9.15.2  Notification インスタンス

Notification オブジェクトの持つメソッドについて説明します。

(1)インスタンス生成

新規の Notification インスタンスを生成し、通知を表示します。

new Notification(title[, options])

通知のための新しく生成された Notification インスタンスを生成し、通知を表示する。

引数 title:通知のためのタイトル

引数 options:通知に適用する設定を含むオプションオブジェクト

dir通知文章の方向(ltr:左から右、rtl:右から左)(規定値:auto)
lang通知の言語(言語コード一覧
badge通知自体を表示する空間が充分にない場合に通知を表す画像の URL
body通知の本文
tag通知のための識別タグ(同じタグは同じ場所に表示される)
iconアイコンのURL
image本文の下に表示される画像
data任意のデータ
vibrateバイブレーションパターン
requireInteraction
silent通知が'sticky'(true)そうでない(false)(規定値:false)

戻り値:Notification オブジェクト


画面の右下に通知が表示されます。そして、一定時間が過ぎると消えます。表示時間はブラウザによって異なります。

ただし、Windows10 の場合、すでに通知がアクションセンターにある場合には表示されないことがあります。そのときは「すべての通知をクリア」などをクリックして、通知を消してください。

では image は表示されないようです。

また、 では icon の大きさにも制限があるようですし、すべてで badge は表示されないようです。

記述例
<button class="button" onclick="notify();">通知</button>   <br>

<script>
var n;
Notification.requestPermission();
function notify() {
  n = new Notification(
    "くま",
    {
      dir: 'ltr',
      lang: 'jp',
      badge: 'images/JSs.png',
      body: 'クマ科に属する哺乳類の総称である。体はよく肥え、がんじょうで、毛はあらい。',
      tag: 'tag',
      icon: 'figures/book.png',
      image: 'figures/bear.png',
      data: {
        xxx: '任意のデータ'
      },
      silent: true,
    }
  );
}
</script>
実行例
ブラウザによる違い (Windows10)




「アクションセンター」ではなく、画面右下にポップアップする。
表示時間:25秒くらい


タグが付加されていない場合や異なる名前のタグが付いている場合は別の通知と見なされ表示を待つ列に加えられます。そして、前の通知の表示が消えると次の通知が表示されることになります。ただし、OSやブラウザによって表示のされ方は異なります。

また、同じ名前のタグが付いている場合はその通知がすでに表示されている場合は、前の通知を閉じて新しい通知を表示します。


次の例のボタンをそれぞれ何回かクリックしてみてください。

記述例
<button class="button" onclick="notify(1);">異なる tag 通知</button> <button class="button" onclick="notify(0);">同じ tag 通知</button><br>

<script>
var n;
Notification.requestPermission();
var titleNo = 0;
var tagNo = 0;
function notify(inc) {
  n = new Notification(
    "くま" + titleNo,
    {
      body: 'クマ科に属する哺乳類の総称である。',
      tag: 'tag' + tagNo,
      icon: 'figures/bear.png',
      silent: true,
    }
  );
  titleNo++;
  tagNo += inc;
}
</script>
実行例

異なる tag 通知のときの表示のされ方(Windows10 のとき)

ブラウザによる違い
「アクションセンター」に、前の通知の上に重ならないように表示される
規定値として3つ(表示を増やしてすべてを見ることもできる)
画面右下に、前の通知の上に重ならないように表示される
規定値として3つ(通知を消せば次の通知を見ることもできる)


(2)インスタンス・プロパティ

プロパティ
dirR/O通知文章の方向(ltr:左から右、rtl:右から左)(規定値:auto)
langR/O通知の言語(言語コード一覧
badgeR/O×
bodyR/O通知の本文
tagR/O通知の識別タグ(同じタグは同じ場所に表示される)
iconR/OアイコンのURL
imageR/O本文の下に表示される画像のURL×
dataR/O任意のデータ
vibrateR/Oバイブレーションパターン
requireInteractionR/O
silentR/O通知が'sticky'(true)そうでない(false)(規定値:false)×
timestampR/O通知の日時(ミリ秒)
記述例
<button class="button" onclick="notify();">通知</button>   <br>

<span id="d01"></span><br>

<!-- 以下略 -->


<script>
var n;
Notification.requestPermission();
function notify() {
  n = new Notification(
    "くま",
    {
      dir: 'ltr',
      lang: 'jp',
      badge: 'images/JSs.png',
      body: 'クマ科に属する哺乳類の総称である。体はよく肥え、がんじょうで、毛はあらい。',
      tag: 'tag',
      icon: 'figures/book.png',
      image: 'figures/bear.png',
      data: {
        xxx: '任意のデータ'
      },
      silent: true,
    }
  );

  d01.textContent = n.title;
  d02.textContent = n.dir;
  d03.textContent = n.lang;
  d04.textContent = n.badge;
  d05.textContent = n.body;
  d06.textContent = n.tag;
  d07.textContent = n.icon;
  d08.textContent = n.image;
  d09.textContent = n.data.xxx;
  d10.textContent = n.silent;
  d11.textContent = new Date(n.timestamp).toLocaleString();
}
</script>
実行例

(3)インスタンス・メソッド

メソッド引数機能戻り値
close()なし通知を閉じるなし

[通知]ボタンを何回かクリックした後、[閉じる]ボタンをクリックしてください。下の例では、先に表示された通知から閉じます。

記述例
<button class="button" onclick="notify();">通知</button><br>
<button id="c" class="button" onclick="notificationClose();" style="disabled:true;">閉じる</button>

<script>
var nstack = [];
Notification.requestPermission();
var no = 0;
function notify() {
  var n = new Notification(
    "くま" + no++,
    {
      body: 'クマ科に属する哺乳類の総称である。',
      icon: 'figures/bear.png',
      silent: true
    }
  );
  nstack.push(n);
  c.disabled = false;
}

function notificationClose() {
  var n = nstack.shift();
  n.close();
  if (nstack.length <= 0) {
    c.disabled = true;
  }
}
</script>
実行例