ここでは、 プログラミング言語によるプログラムの組み立てそのものの理解は 他で済ませるものと仮定し、JavaScript の基本的な文法仕様に絞って説明する。 本講で想定しているプログラム動作環境はWebブラウザであるが、 厳密にはブラウザの持つ言語処理系によって仕様の異なる部分がある。 ここでは、ECMAScript 7th Edition(June 2016) の仕様に基づいて説明する。 ECMAScript は Netscape Navigator 由来の JavaScript と、Microsoft による JScript の双方に基づいて策定されたプログラミング言語定義である。 本講で用いる「JavaScript」という語は、ブラウザ全般で動くものを想定するため、 「ECMAScript」の持つ概念に近い。 EcmaScript のバージョンに応じて、 ES6あるいはES7といった表記を用いることがある。
多くの言語と異なり JavaScript の変数は型を持たない。
型を持たないため、文字列を入れた後に数値を再代入することもできる。
また、宣言なしでも使えるが、var
で宣言すると、宣言した位置のみで通用する変数が確保される。
宣言位置が関数の外であれば全域(グローバル)、関数内であれば
関数内のみで有効な変数となる。var
宣言なしでいきなり代入した場合は、位置に依らずグローバル変数となる。
以下の例を参照せよ。
g1 = "外側のg1"; // g1, g2 ともにトップレベルなので var g2 = "外側のg2"; // いずれもグローバル変数 function foo() { var g1 = "fooでg1を設定"; // foo()関数内のみ有効 → 抜けると消える g2 = "fooでg2を設定"; // グローバル変数の上書き → 抜けても残る g3 = "fooでg3を設定"; // グローバル変数となる → 抜けても残る var g4 = "fooでg4を設定"; // 関数内のみ } foo(); console.log("g1="+g1); // => "g1=外側のg1" console.log("g2="+g2); // => "g2=fooでg2を設定" console.log("g3="+g3); // => "g3=fooでg3を設定" console.log("g4="+g4); // g4変数未定義エラーで実行されない
ログコンソールに出る実行は以下のとおりである。
ReferenceError: g4 is not defined | var-scope.js:14:0 |
"g1=外側のg1" | var-scope.js:11:0 |
"g2=fooでg2を設定" | var-scope.js:12:0 |
"g3=fooでg3を設定" | var-scope.js:13:0 |
変数 g4
を出力しようとする行(14行目)はエラーとなっている。
ECMAScript 2015 以降では変数宣言として let
と
const
が利用できる。
let
ブロックスコープの変数を宣言する。
const
ブロックスコープの定数変数を宣言する。初期値からの変更はできない。
ブロックスコープとは、{ }
で囲まれた範囲で有効となるものである。
// 関数外(グローバル) var g1="関数外で定義した var g1"; var g2="関数外で定義した var g2"; let g3="関数外で定義した let g3";// 関数スコープ function foo() { var g1 = "foo内で定義した var g1";foo(); console.log(g1);if (true) { // ブロックスコープ let g2="foo/if内で定義した let g2"; //ifブロックを抜けると消滅 var g3="foo/if内で定義した let g3"; }console.log(g1); console.log(g2); console.log(g3); }
ECMAScript 2015 以降の仕様を満たすインタプリタでは以下のような出力結果となる。
foo内で定義した var g1 関数外で定義した var g2 foo/if内で定義した let g3 関数外で定義した var g1
基本的な型について説明する。
文字列を表す型が String 型である。文字列リテラルは シングルクォートまたはダブルクォートで囲って表記する。 リテラル文字列内ではいくつかの文字をバックスラッシュを用いて表す。
\b | バックスペース文字 |
\t | タブ文字 |
\n | 改行文字 |
\v | 垂直タブ文字 |
\f | フォームフィード(改ページ)文字 |
\r | 復帰文字 |
\' | シングルクォート文字 |
\" | ダブルクォート文字 |
たとえばダブルクォートもしくはシングルクォートでくくった文字列内に それ自身を含ませたいときは以下のようにすればよい。
var str1 = "He said \"yes\"." => He said "yes". var str2 = 'Let\'s begin!' => Let's begin!
ES6では、バッククォートで囲むことにより、 改行文字を含ませたり変数展開が可能な テンプレートリテラル が使用できる。
var str1 = "foo"; var str2 = `str1 is ${str1}`;
とすると、str2
の値は、${str1}
の部分がその値に展開されて、
str1 is foo
となる。printfの使えないJavaScriptでは、文字列中に 変数の値を交ぜることが面倒なので、テンプレートリテラルを利用すると便利である。
console.log(`xの値 = ${x}`)
JavaScriptで扱える数値は整数と浮動小数点数の2種類である。 数値は '0x' 前置による16進数表記や、10進指数表記も可能である。
x = 0x100 => 256 y = 120 + 3e3 => 120 + 3×102 = 3120
整数と浮動小数点数の変換は自動的に行なわれる。
1 + 2 => 3 5/2 => 2.5 2.5*2 => 5
プログラムでは文字列と数値を相互に変換する必要がたびたび発生する。 演算によって自動的に変換する方法と専用の変換関数を利用する方法がある。
数値に空文字列を「加算」することで文字列化できる。
123+"" // これは "123" に変換される。
変換後が文字列であることを確認するには、値の型を返す
typeof
を利用するとよい。
typeof(123+"") => string
toString
関数を利用すると数値単体で変換できる。
x = 123; y = x.toString(); => "123" hex = x.toString(16); => "7b"
toString 関数に引数を渡すと変換時の基数となる。上の例は123を 16進数に変換したもので、基数は2から36まで指定できる。
文字列を数値に変換するには文字列になく数値にある演算をするか、
parseInt
または
parseFloat
関数を利用する。
s = "1024.5" num1 = s/1 => 除算は文字列にないので数値化される num2 = parseInt(s) => 1024(整数化) num3 = parseFloat(s) => 1024.5(浮動小数点数化)
空の配列は []
または、new Array()
で得られる。配列の長さ(要素数)は length
プロパティで得られる。
x = ['foo', 'bar', 'baz'];
x.length
=> 3
以下の例では変数x
に上記の値があると仮定する。
メソッド | 働き | 例 |
---|---|---|
pop() | 末尾要素を取り出す。 | x.pop() → 'baz' が返り、
x の値は ['foo', 'bar'] に変わる。 |
push() | 末尾に追加し新しい長さを返す。 | x.push('baz') → 3が返り、
x の値は ["foo", "bar"] に変わる。 |
reverse() | 要素順を逆転させる。 | x.reverse() → xの値が
["baz", "bar", "foo"] に変わる。 |
shift() | 最初の要素を取り出してその値を返す。 | x.shift() → x[0] の値(x
が初期値の場合"foo" ) が返り、残りの要素が先頭に詰められる。
|
unshift() |
配列の先頭部分に要素を追加し、新しい長さを返す。 | x.unshift('hoge') → 3が返り、x
の値が ["hoge", "bar", "baz"] になる。
|
sort() | 要素を整列する。 | (y=[3,2,1]).sort() → [1,2,3]
が返り、y の値もそれになる。 |
数値を対象とする演算記号についてまとめる。
次の演算子は、直後に値を伴いその値に対する演算結果を返す。
演算子 | 働き | 例 |
---|---|---|
+ |
直後の値を数値に変換する | +"5" => 5 |
- |
直後の値を数値に変換し符号を反転する | -"-3.2" => 3.2 |
~ |
直後の値を数値に変換しビットを反転する(32ビット整数として) |
|
! |
論理値の反転を行なう | !true => false |
次の演算子は2つの値の中間に位置し、 2つの値から得られる演算結果を返す。
演算子 | 働き | 例 |
---|---|---|
+ |
加算 | 1 + 2 => 3 |
- |
減算 | 1 - 2 => -1 |
* |
乗算 | 11 * 11 => 121 |
/ |
除算 | 11 / 2 => 5.5 |
** |
べき乗 | 2 ** 5 => 32 |
% |
剰余算 | 10 % 7 => 3 |
また、上記各演算子の直後に =
を付加したものは、代入演算となる。たとえば、
x += 3
は、変数 x
の元の値に3を足す。
このとき、元の x
が文字列か数値かによって結果が異なる点に注意が必要である。
x = 12 x += 3 => 15 x = "12" x += 3 => "123"
2つの値を比較する演算を行なう演算子を示す。
演算子 | 働き | 例 |
---|---|---|
< |
左辺が右辺より小さければ true | x < 5 |
<= |
左辺が右辺以下なら true | x <= 5 |
> |
左辺が右辺より大きければ true | x > 5 |
>= |
左辺が右辺以上なら true | x >= 5 |
== |
左辺と右辺が等値なら true | x == y |
=== |
左辺と右辺が型も値も完全に等しければ true | x === y |
!= |
左辺と右辺が等しくなければ true | x != y |
!= |
左辺と右辺が === でなければ true | x != y |
注意すべきは ==
と ===
の違いで、
前者は型が違っても型変換により等価になるものは等しいとみなす。
5 == 5 // => true 5 === 5 // => true 5 == "5" // => true 5 === "5" // => false
論理値の組み合わせに対して論理演算を行なう演算子を示す。
演算子 | 働き | 例 |
---|---|---|
&& |
論理積 | x > 5 && x < 10 |
|| |
論理和 | x < 5 || x > 10 |
^ |
排他的論理和 | sig1 == "blue" ^ sig2 == "blue" |
文字列(String型)の値を操作する関数について有用なものを示す。
関数 | 働き |
---|---|
charAt(pos) |
位置posの文字を返す |
charCodeAt(pos) |
位置posの文字の文字コードを返す |
concat(args...) |
自身に args... の文字列をすべて結合した文字列を返す |
endsWith(searchString[, endPosition]) |
文字列(の位置endPosition直前まで)が、
searchString で終わっていれば true 、
いなければ false を返す |
startsWith(searchString[, Position]) |
文字列(の位置startPosition)が、
searchString で始まっていれば true 、
いなければ false を返す |
includes(searchString[, position]) |
文字列(の位置 Position 以降)に
searchString が含まれていれば true 、
いなければ false を返す |
indexOf(searchString[, position]) |
文字列(の位置 Position 以降)に
searchString が含まれていればその添字位置を、
いなければ -1 を返す |
lastIndexOf(searchString[, position]) |
indexOf と同様だが最後に含まれている位置を返す |
match(regexp) |
文字列が、正規表現 regexp
にマッチする部分を持てばそれに関する情報を、なければ null
を返す |
search(regexp) |
文字列が、正規表現 regexp
にマッチする部分を持てばその位置を、なければ -1
を返す |
repeat(count) |
文字列を count 回繰り返した文字列を返す |
slice(start[, end]) |
文字列の start から end 直前までの部分文字列を返す(負の引数は文字列終端からの指定になる) |
trim() |
前後にある(連続した)改行・空白文字をすべて除去した文字列を返す |
split(separator, limit) |
文字列中に含まれる separator を境界として(最大 limit 個の)配列に分割した値を返す (separator に空文字列を指定すると1字ごとに分割) |
substr(start[, length]) |
位置 start 以降(から length 字)の部分文字列を返す |
substring(start, end) |
位置 start 以降(から位置 end 直前まで)の部分文字列を返す(2つの引数のうち小さい方が開始位置、 そうでない方が終了位置指定になる) |
toLowerCase() | 小文字化した文字列を返す |
toUpperCase() | 大文字化した文字列を返す |
変数 email に文字列が格納されているとする。上記の文字列操作関数を 利用し、
それぞれ代入するコードを書け。ただし、@文字が含まれていない場合、 2個以上含まれている場合はいずれの変数にも "" を代入する。
// var email = " hogehoge@example.com \n"; var e = email.trim(); var atpos = e.indexOf('@'); var localpart = "", domainpart =""; if (atpos >= 0 && atpos == e.lastIndexOf('@')) { localpart = e.substring(0, atpos); domainpart = e.substr(atpos+1); }
JavaScriptでは文字列内を検索するパターンに正規表現
が使える。正規表現はパターンを / / で囲んだ正規表現リテラル
または、元となる文字列を RegExp
関数に渡して生成する。
また、文字列と正規表現との照合は 文字列.match
関数あるいは 正規表現.exec
関数を用いる。
先に利用できるパターンについてまとめる。
記号/文字 | 働き | 例 | |
---|---|---|---|
対象文字種の指定 | |||
. | 任意の1字にマッチ | .@. | @の前後に何か1字ずつある |
| | 選択 | Regexp1|Regexp2
| Regexp1 または
Regexp2 のいずれかにマッチ |
[Class] | 文字クラスの指定 | [-a-z0-9] |
ハイフンまたはaからzのどれかまたは0から9のどれか1字 |
[^Class] | 文字クラスの指定(反転) | [^0-9] |
0から9以外のどれか1字 |
\d | 数字(0-9) | \d\d |
数字が2つ続くものにマッチ |
\D | 数字以外 | \D\d\d\D |
非数字 数字 数字 非数字 と続くものにマッチ |
\s | 空白文字(SPC, TAB, LF) | \d\d\w\d\d |
数字 数字 空白 数字 数字 と続くものにマッチ |
\S | 空白文字以外 | \s\S\S |
空白文字の直後に非空白文字が2つ続く |
\w |
英数字とアンダースコア([A-Za-z0-9_]と同じ) | \w\w\w |
英数字かアンダースコアが3つ続くものにマッチ |
\W | \w の文字以外 |
\W\W |
英数アンダースコア文字以外が2つ続くものにマッチ |
マッチする位置の指定 | |||
^ | 先頭位置(パターン先頭に書いた場合) | ^\d\d\d\d | 先頭が数字4桁で始まるものにマッチ |
$ | 末尾位置(パターン末尾に書いた場合) | \s$ | 空白文字で終わる文字列にマッチ |
\b | 単語(\w の並び)の境界 |
station\b |
nの位置で単語として終わる station にマッチ |
\B | 単語(\w の並び)の境界以外 |
station\B |
nの位置で単語として終わらない station にマッチ |
マッチする量の指定 | |||
* | 直前の単位の0回以上の繰り返し | ^\d*\.\d*$ |
行頭、0個以上の数字、ピリオド、0個以上の数字、 行末と続く文字列にマッチする。 |
+ | 直前の単位の1回以上の繰り返し | \s+$ |
1つ以上空白が連続して終わる文字列にマッチ |
? | 直前のマッチ単位が0回か1回 | foo, ?bar |
"foo," の後に空白が0個か1個ありその後に "bar" が続く文字列にマッチ |
グルーピングと先読み | |||
(Regexp) |
括弧内のパターンを単一化しマッチしたものがあればそれを記憶する。
N番目の括弧でマッチしたものは、検索パターン内では
\N 、検索直後では RegExp.$N
で参照できる。 |
(['"]).*\1 |
シングルクォート又はダブルクォートがあればそれをグループ1とし、
その後ろに任意の文字列が来たあとグループ1と同じ文字列(つまり
シングルクォートかダブルクォートのうちマッチした方)が来る文字列にマッチする。
マッチした場合直後に RegExp.$1
でマッチした文字列が取り出せる。 |
(?=Regexp) |
肯定先読み(マッチさせたいパターンの前か後に置き「Regexp にマッチする文字列がそこにある場合」のみ本来のパターンをマッチさせる) | \w+(?=station) |
後に "station" がある単語部分("station" 部を除く) |
(?!Regexp) |
否定先読み(マッチさせたいパターンの前か後に置き「Regexp にマッチしない文字列がそこにある場合」のみ本来のパターンをマッチさせる) | 該当(?!し[なま]|せず) |
後に「しな」、「しま」、「せず」いずれも続かない場合の「該当」 という文字列にマッチする。 |
特殊文字の表現として、以下の表記が利用できる。
\t | 水平タブ |
\v | 垂直タブ |
\n | 改行 |
\r | 復帰 |
\f | 改ページ |
正規表現のパターン指定の後ろに特定のフラグをつけて、 検索時の挙動を制御できる。主なフラグを示す。
フラグ | 意味 | 指定例 |
---|---|---|
i | 英大文字小文字を同一視する | /abc/i |
g | (global) 何回もマッチさせる(マッチした文字列の配列が返る) | /a../g |
m |
入力文字列の複数行に対して^ や
$ のマッチングを行なう |
/^foo/m |
正規表現で文字列照合を行ないマッチした直後には、 マッチした部分の文字列などのいくつかの情報がグローバル変数に代入されている。
RegExp.lastMatch ($&) |
マッチした部分全体 |
RegExp.lastParen ($+) |
最後のグルーピングでマッチした文字列 |
RegExp.leftContext ($`) |
パターンでマッチした部分全体より前にある文字列 |
RegExp.rightContext ($') |
パターンでマッチした部分全体より後ろにある文字列 |
RegExp.$1 から RegExp.$9 |
1番目から9番目までのグルーピングによりマッチした文字列 |
括弧内に示した $ で始まる記号は、 次に示す置換文字列として参照できるものである。
replace()
関数を用いると、
文字列に含まれるパターンを別のものに置き換えることができる。
文字列.replace(パターン, 置換後文字列)
パターン の部分には固定的な文字列あるいは正規表現を指定でき、 元の文字列のうちパターンにマッチした部分が 置換後文字列に置き換えられる。これには通常の文字列のほか、 以下の特殊文字列も利用できる。
$$ | $ 文字自身 |
$& | マッチした文字列 |
$` | マッチした部分より前の文字列 |
$' | マッチした部分より後ろの文字列 |
$N (Nは1から9まで) |
N 番目のグルーピングでマッチした文字列 |
たとえば以下のようにすると、元の文字列の前後に括りをつけることができる。
'abc'.replace(/.*/, '<$&>') => '<abc>'
変数 email に文字列が格納されているとする。上記の正規表現操作関数を 利用し、
それぞれ代入するコードを書け。ただし、@文字が含まれていない場合、 2個以上含まれている場合はいずれの変数にも "" を代入する。
// var email = " hogehoge@example.com \n"; var localpart = "", domainpart =""; if (email.match(/\s*(\S+?)@([^@]+)\s*/)) { localpart = RegExp.$1; domainpart = RegExp.$2; } alert("email="+email+", localpart="+localpart+", domainpart="+domainpart);
JavaScriptで用意されている数値演算関連のものを示す。
Number.EPSILON |
x>1 と判定できる最小のxでの x-1 の値 |
Number.MAX_SAFE_INTEGER |
nとn+1を区別して表現できる最大の整数で 253-1 |
Number.MIN_SAFE_INTEGER |
nとn-1を区別して表現できる最小の整数で -(253-1) |
Number.MAX_VALUE |
数値型で表現できる最大の正の数で約 1.7976931348623157×10308 |
Number.MIN_VALUE |
数値型で表現できる最小の正の数で約 5×10-324 |
Math.E |
自然対数の底eの近似値で 2.718281828459045 |
Math.PI |
円周率πの近似値で 3.141592653589793 |
Math.LN10 |
log(10)の近似値で 2.302585092994046 |
Math.LN2 |
log(2)の近似値で 0.6931471805599453 |
Math.LOG10E |
log10(e)の近似値で 0.4342944819032518 |
Math.LOG2E |
log2(e)の近似値で 1.4426950408889634 |
Math.SQRT1_2 |
1/√2の近似値で 0.7071067811865476 |
Math.SQRT2 |
√2の近似値で 1.4142135623730951 |
下記関数はいずれも定義域外で NaN
を返す。
Math.abs(x) | 絶対値 |
Math.acos(x) |
逆余弦 -1≦x≦1, 値域: [+0, +π] |
Math.acosh(x) |
逆双曲線余弦 x≧1 |
Math.asin(x) |
逆正弦 -1≦x≦1, 値域: [-π/2, +π/2] |
Math.asinh(x) |
逆双曲線正弦 |
Math.atan(x) |
逆正接 値域: [-π/2, +π/2] |
Math.atan2(y,x) |
y/xの逆正接 値域: [-π, +π] |
Math.atanh(x) |
逆双曲線正接 -1≦x≦1 (x=±1で±Infinity ) |
Math.cbrt(x) | 立方根 |
Math.ceil(x) |
正の方向で最も近い整数(xが整数なら自身) |
Math.clz32(x) |
xを32ビット整数で表したときの先行連続する0の和 |
Math.cos(x) | 余弦 |
Math.cosh(x) | 双曲線余弦 |
Math.exp(x) | ex |
Math.expm1(x) |
ex-1 (0近傍での桁落ち軽減) |
Math.floor(x) |
負の方向で最も近い整数(xが整数なら自身) |
Math.fround(x) |
最も近いIEEE 754-2008フォーマット値 |
Math.hypot(value1, value2, ...) |
二乗和の平方根 |
Math.imul(x, y) |
符合なし32ビット整数内での乗算 |
Math.log(x) |
自然対数 x>0 |
Math.log10(x) |
log10x |
Math.log1p(x) |
log(1+x) (0近傍での桁落ち軽減) |
Math.log2(x) | log2x |
Math.max(value1, value2, ..) | 最大値 |
Math.min(value1, value2, ..) |
最小値 |
Math.pow(b, x) |
bx |
Math.random() |
[0, 1) の範囲の一様擬似乱数 |
Math.round(x) |
最も近い整数へ丸め(小数部 .5 の 場合は正の側へ) → ※ |
Math.sign(x) | 符号 |
Math.sin(x) | 正弦 |
Math.sinh(x) | 双曲線正弦 |
Math.sqrt(x) | 平方根 |
Math.tan(x) | 正接 |
Math.tanh(x) | 双曲線正接 |
Math.trunc(x) | 小数部切捨て |
Number.isFinite() | Infinityでないか |
Number.isInteger() | 整数か |
Number.isNaN() | NaNか |
Number.parseFloat(string) |
文字列を浮動小数点数へ |
Number.parseInt(string) |
文字列を整数へ |
Number.toString([radix]) |
(radix進数の)文字列へ |
※: 小数点以下の指定桁で四捨五入したものを文字列にする場合は、
Number.toFixed(小数桁)
が有用である。たとえば 3.1415.toFixed(3) とすると第4位を四捨五入して
"3.142"
が得られる(文字列であることに注意)。
JavaScriptの標準関数には日付を表現できるものとして Date 型のオブジェクトがある。Date オブジェクトを介すと日付の計算などが可能となる。 生成は以下のいずれかの引数指定でコンストラクタを呼ぶ。
呼び方 | 生成されるDateオブジェクトの時刻 |
---|---|
new Date() | 現在時刻 |
new Date(EpochMS) | Unixエポックで EpochMS ミリ秒時点の時刻 |
new Date(String) | String で表現される日付時刻 |
new Date(year, month-1[, day[, hour[, min[, sec[, ms]]]]]) |
日付時刻文字列の指定では
YYYY-MM-DDTHH:mm:ss.sssZone
の書式が求められる。YYYY から ss.sss までの部分はそれぞれ西暦年、月(2桁)、日(2桁)、時(24時間制2桁)、 分(2桁)、秒.ミリ秒 の数値である。また、Zone の部分はタイムゾーン表記で、以下のような規則で記述する。
Z | UTC(世界協定時)の指定 |
+HH:mm | プラスの時差指定 |
-HH:mm | マイナスの時差指定 |
JavaScript では時刻を1970年1月1日午前0時(UTC)からのミリ秒
(エポックミリ秒)を基準としている。これは Date.now()
関数で得られる。
Date.now() | 現在時刻のエポックミリ秒を返す |
Date オブジェクトのメソッドの主なものを示す。
getDate() | 日(1-31)を返す |
getDay() | 曜日(0-6)を返す |
getFullYear() | 西暦年を返す |
getHours() | 時(0-23)を返す |
getMilliseconds() | ミリ秒(0-999)を返す |
getMinutes() | 分(0-59)を返す |
getMonth() | 月-1(0-11)を返す |
getSeconds() | 秒(0-59)を返す |
getTime() | UTCエポックミリ秒を返す |
getTimezoneOffset() | タイムゾーン差を分で返す |
getUTCDate() | UTCでの日(1-31)を返す |
getUTCFullYear() | UTCでの西暦年を返す |
getUTCHours() | UTCでの時(0-23)を返す |
getUTCMilliseconds() | UTCでのミリ秒(0-999)を返す |
getUTCMinutes() | UTCでの分(0-59)を返す |
getUTCMonth() | UTCでの月-1(0-11)を返す |
getUTCSeconds() | UTCでの秒(0-59)を返す |
toDateString() | 可読文字列を返す |
toISOString() | ISO8601拡張形式文字列を返す |
toJSON(key) | toISOString()
を返す |
toString() | 日付文字列を返す |
上記関数名の "set"
を "get"
に変えると該当数値を変更する関数名になる。
例として、「1週間後の日付文字列を求める」コードを示す。
now = Date.now(); // 現在時刻(エポックミリ秒) oneweek = new Date(now + 1000*3600*24*7); // 7日後の時刻で Date 生成 expire = oneweek.toISOString(); // ISO8601文字列化する
JavaScriptではローカルタイムとUTCの相互変換を互換性高く
行なうことが容易でない。時刻の比較はUTCエポック時刻で行ない、
ローカル時刻は表示したいときの最後に getHours()
関数などで取得する流れで行なうとよい。
JavaScript では、関数定義に関数宣言 と 関数式 が利用できる。
参考: MDN Web Docs 関数
// 関数宣言 function foo(msg) { console.log(msg); } // 関数式 var foo = function(msg) { console.log(msg); } // アロー関数式 var foo = (msg) => { // 引数1つのときは()を省略して msg => {...} でもよい console.log(msg); }
関数宣言は、その関数がその名前で呼ばれることが固定的なときに、
関数式は関数の呼ばれる場所が呼出し記述場所と異なる場合に主に用いる。
たとえば、指定時間経過後に行なう処理を登録する
window.setTimeout
関数は以下のように用いる
window.setTimeout(関数, ミリ秒) = > timeoutID
例として3秒後にalertメッセージを出す簡単な例を示す。
var tID = window.setTimeout(function() {
alert("時間切れです!");
}, 3000);
あるいはアロー関数式を用いて以下のようにも書ける。
var tID = window.setTimeout(()=>{alert("時間切れです!");}, 3000);
Webページと連動して動くプログラムでは、 時間のかかる通信処理などの関数呼出しが多く、それらの終了を待つと プログラム全体の処理に時間がかかる。そのため瞬時に終わらない処理を 呼ぶときは終了を待たず先に進み、呼び出した処理が終わったときにすべきことを 関数オブジェクトとして渡す形を多用する。function キーワードからなる 名前を与えられていない関数のことを無名関数という。 また、呼んだ先の関数に、さらに次の処理をする関数を呼んでもらうことを コールバック という。
このように、別の処理の終了を待たずに先に進む処理を非同期処理といい、 とくに JavaScript で HTML/XML テキストの通信を非同期で行ないながら 進めるものを Ajax と呼ぶ。