トップページに戻る
Javascript文法
このページでは、特にWebで使われる フロントサイド
Javascript の文法を説明します。
クライアントアプリに使える Node.js については、
Electronアプリで
少し説明しています。
HTMLへの読み込み
- HTML内でのJavascriptファイル script.js の読み込み:
<script src="script.js"></script>
(<head>でも<body>でもよい)
script.jsで定義されている変数や関数にアクセスできる
- HTML内での Javascript の記述:
<script>
// ここに Javascript文
</script>
文の単位
- 単文: ; で終了
- ブロック文: { } で囲う
- 継続行: 通常は必要ないが、\n を \
でエスケープできる
コメント文
- 各行で、// 以降は無視される
- /* ~ */ は Javascriptのコメント。入れ子にはできない
- 先頭行のみ、#! で始まる場合は無視される
- <!-- ~ --> は HTMLのコメント
予約語
await, break, case, catch, class, const, continue, debugger, default, delete,
do, else, enum, export, extends, false, finally, for, function, if, import,
implements, in, instanceof, interface, let, new, null, package, private,
protected, public, return, static, super, switch, this, throw, true, try, typeof,
var, void, while, with, yield
変数の型
- プリミティブ型:
string、number、boolean、null、undefined、symbol
- 未定義型・未定義値: undefined
・ 変数が未定義を明示する場合に使う
・ 変数が未定義の場合は、typeof myVar が未定義型
"undefined" を返す
- ヌル値: null
・
変数の値は定義されているが、例外値であることを明示する場合に使う
- bool型: true, false
- 文字列型 (string): ""あるいは '' で囲む
- 数値型 (number): 整数、浮動小数点の区別はない
- NaN値
- 配列
- 型月配列: ArrayBuffer(), Int8Array(), Uint8Array(), Float32Array()など
let myVar = new Uint8Array(4);
- オブジェクト(object): 連想配列、辞書型
日付オブジェクト: let date = new Date(year, month, day, ...);
- 関数: function func_name()
- シンボル型 (symbol)
型のチェック: typeof
例: if (typeof myVar === "string") { }
配列かどうかのチェック:
例: Array.isArray(myVar)
例: myVar instanceof Array
オブジェクト
- Javascriptでは、プリミティブ型を除いて、ほとんどがオブジェクトです。
ただし、プリミティブ型であっても、string.loengthのようにオブジェクトとして扱われることがあります
- オブジェクトの属性値はプロパティ、関数はメソッドと呼ばれます
- オブジェクトの基本的な書式は
{ attr: value, ... } (静的プロパティ名)
です。変数 label を属性に使う場合は
{ [label]: value } (動的プロパティ名)
とします。
ブロック
変数宣言
- 以前は var宣言が使われていましたが、globalスコープになるため、推奨されていません
- const myVar = "aaa"; // 定数
- let myVar = "aaa"; //
ブロック内のみで有効な局所変数
for文でも使える: for (let i = 0 ; i < 10 ; i++) { }
- 変数名は半角英数字、_。大文字小文字を区別する
- strict modeを使うことで、文法チェックが厳しくなる。
例:
未定義変数への代入、書き込み禁止属性への代入、削除不可変数のdelete、関数引数の重複
一番最初に
"use strict";
と書く
- 配列の作成
array = [v1, v2, ..]
array = new Array()
array = new Array(n)
array = new Array(v1, va2, ...)
Array.from(arrayLike)
Array.of(v1, v2, ...)
- 配列の長さ: array.length
- key, valueを返す: array.entries()
- keyを返す: array.keys()
- valueを返す: array.values()
- sに一致する要素の最初のindexを返す: array.indexOf(s)
- sに一致する要素の最後のindexを返す: array.lastIndexOf(s)
- sに一致する要素があるかどうかを判断: array.includes(s)
- indexの要素が存在するかどうかを判断: index in array
- n番目の要素を取り出す。負の値を使える: array.at(n)
- arrayの先頭にv1, v2, ..の要素を追加: array.unshift(v1、v2,
...)
- arrayの最後にv1, v2, ..の要素を追加: array.push(v1、v2, ...)
- arrayの先頭の要素を削除 array.shift()
- arrayの最後の要素を削除: array.pop()
- ソート: array.sort([func])
- 要素を逆順に並べ替える: array.reverse([func])
- 配列の連結: array.concat(array2, ...)
- 配列の要素を連結: array.join(seperator)
- 配列を文字列へ変換: array.toString()
- 高次元配列の次元を落とす: array.flat(depth)
- arrayが配列かどうかを判断: Array.isArray(array)
- 全ての要素にcallbackを実行し、全てtrueであればtrueを返す:
array.every(callback)
- 要素にcallbackを実行し、trueの要素があればtrueを返す:
array.some(callback)
- 要素にcallbackを実行し、最初にtrueになった要素を返す:
array.find(callback)
- 要素にcallbackを実行し、最初にtrueになった要素を返す:
array.findLast(callback)
- 要素にcallbackを実行し、最後にtrueになった要素のindexを返す:
array.findIndex(callback)
- 要素にcallbackを実行し、最後にtrueになった要素のindexを返す:
array.findLastIndex(callback)
- 各要素にcallbackを呼び出す: array.map(callback)
- 各要素にcallbackをよびだす
array.forEach(function(value, index, array) {
...;
});
配列
配列の代入
let x = 5, y = 10;
[x, y] = [y, x]; // x と y を交換
スライス
const numbers = [10, 20, 30, 40, 50];
const sliced = numbers.slice(1, 3); //
1から2までの要素を配列として取得。負のインデックスは最後から数える
ネストされた配列の代入
const matrix = [[1, 2], [3, 4]];
const [[a, b], [c, d]] = matrix
分割代入
const numbers = [10, 20, 30];
const [a, b, c] = numbers;
const numbers = [10, 20, 30, 40];
// 1つ目と3つ目の要素を取得(2つ目はスキップ)
const [first, , third] = numbers;
const numbers = [10, 20, 30, 40, 50];
// 最初の要素を `first` に、残りを `rest` に
const [first, ...rest] = numbers;
// 最後の要素を `last` に、残りを `rest` に
const numbersReversed = [...numbers].reverse();
const [last, ...restReversed] = numbersReversed;
オブジェクトの代入
オブジェクトの場合、分割代入
(デストラクチャリング)が使えます。
const user = { name: "Alice", age: 25, country: "Japan" };
const { name, age, country } = user;
分割代入による初期値の設定
const { userName = "none" } = user;
とすることで、変数 userName には user.userName が
代入されますが、user.userName が未定義の場合、"none"
が代入されます。
変数名を属性名と変える場合は
const { name: userName = "none" } = user;
とします。
プロパティ名の変更
// `name` を `userName` という変数名に変更
const { name: userName, age: userAge } = user;
デフォルト値の変更
// `age` は存在しないのでデフォルト値 `20` が適用される
const { name, age = 20, country = "Unknown" } = user;
ネストされたオブジェクトの分割代入
const person = {
name: "David",
address: {
city: "Tokyo",
zip: "100-0001"
}
};
// ネストされたオブジェクトを分割代入
const { name, address: { city, zip } } = person;
スプレッド構文 (...)
const user = { name: "George", age: 28, country: "USA", job: "Engineer" };
// `name` と `age` を取得し、残りを `rest` にまとめる
const { name, age, ...rest } = user;
関数宣言
function func_name(引数) {
}
アロー関数
const greet = (message) => {
console.log(message);
};
const multiply = (a, b) => a * b;
const square = n => n * n;
// 引数が1つの場合は () を省略できる
デフォルト引数:
引数に undefined
が渡された場合に、デフォルト引数が使われます
(未定義値を渡したい場合は null を渡すこと)。
pythonと異なり、先に出てきた引数をデフォルト引数として使うことができます。
function func_name(var1,var2 = "abc", var3 = `${var2}_def` {
}
キーワード引数:
Jaascriptではキーワード引数は使えません。オブジェクトを使うことで類似のことが実現できます。
オブジェクトの分割代入を使うと便利です。
function configureSettings(options = {}) {
const { theme = "light", fontSize = 16, language = "en" } = options;
console.log(`Theme: ${theme}, Font Size: ${fontSize}, Language: ${language}`);
}
function printUser({ name, age = 18 }) {
console.log(`Name: ${name}, Age: ${age}`);
}
const user = { name: "Emma", age: 22 };
printUser(user); // "Name: Emma, Age: 22"
スプレッド構文の利用
function printDetails({ name, ...details }) {
console.log(`Name: ${name}`);
console.log("Other details:", details);
}
printDetails({ name: "Charlie", age: 28, city: "Tokyo" });
即時実行関数
関数定義を () でくくると、即時実行される
(function() {
console.log("この関数は即時に実行されます!");
})();
(() => {
console.log("This function runs immediately!");
})();
数学関数
- Math.random(), Math.abs(), Math.PI, Math.sin()など
- 行列計算:
const XT = math.transpose(X);
const XTX = math.multiply(XT, X);
const invXTX = math.inv(XTX);
基本構文
- 条件分岐:
if (n < 10) {
...;
} else {
...;
}
- 条件分岐:
switch (n) {
case 1:
...;
break;
case 2:
...;
break;
default:
...;
break;
}
- 繰り返し:
while (n < 10) {
...;
n++;
}
- 繰り返し:
do {
...;
n++;
} while (n < 10);
- 繰り返し:
for (i = 0 ; i < 10 ; i++) {
...;
}
const array = [1, 2, 3];
for (let index in array) {
print(array[index]);
}
for (let value of array) {
print(value);
}
array.forEach(value, index) => {
print(`index: ${index}, value: ${value}");
}
for (let [index, value] of array.entries()) {
print(`index: ${index}, value: ${value}");
}
- ループ処理
break;
for (let i = 0 ; i < 10 ; i++) {
if (i == 5) {
break;
}
}
break label;
start:
for (let i = 0 ; i < 10 ; i++) {
if (i == 5) {
break start;
}
}
continue;
continue label;
- ジャンプ:
goto label
オブジェクト参照
- withを使うとオブジェクト名を省略できる
with (doc) {
print(color);
}
は
print(doc.color);
に等しい
例外処理
- try {
...;
if (error) {
throw "myException";
}
} catch (e) { // catchの変数 (e) は省略できる
..;
} finally {
...;
}
イベントハンドラ
Javascriptでは、HTMLの要素でイベントハンドラを結びつける
(bind) ことができます。
例: <input type=”button”value=”push”onclick="count()""
/>
で、"push"と書いてあるボタンをクリックすると
count() 関数を呼び出します。
- onclick(): 要素がクリックされたとき
- onblur(): 要素のフォーカスが外れたとき
- onfocus(): 要素にフォーカスが当たったとき
- onsubmit(): フォームを送信するとき
- onchange(): 要素のデータに変更があったとき
- onselect(): select要素などで選択がされたとき
- onload(): 要素が読みこまれたとき
- onkeyUp(): 押していたキーを離したとき
- onkyDown(): キーを押したとき
- onkeyPress(): キーを押しているとき
モジュール
- モジュール内でexportする関数や変数の宣言
export function func_name() { }
export let var_name = 5;
export func_name, var_name;
export * as mod from "./module.js";
- 読み込み側ではimportを使う:
import "./module.js";
import { func_name } from "./module.js";
import { func_name1 as f1, func_name2 as f2 } from "./module.js";
import * as mod from "./module.js";
- HTMLからの読み込み:
<script type="module" src="module.js"></script>
- モジュールのメタ情報:
import.meta
デバッグ支援
- console.log()で開発者ツールのコンソールに出力
- debugger;
を入れて、開発者ツールを開いて実行すると、ここで実行が止まってデバッグモードに入る
算術演算子:
- 四則演算: +, -, *, /
- 剰余: %
- べき乗 **
- インクリメント: ++myVar, myVar++
- デクリメント: --myVar, myVar--
比較演算子:
- 値の比較: ==, !=, <, <=, >, >=
- 厳密な一致比較 (値と型の両方): ===, !==
myVar == undefined: 変数 var がundefinedあるいはnullの場合は
true。varが未定義変数の場合はエラーになる
myVar === undefined: 変数 var がundefinedの場合はtrue。varが未定義変数の場合はエラーになる
typeof myVar == "undefined": 変数 var
が未定義あるいは未定義値 (undefined) かどうかの場合は
true。
論理演算子・ビット演算子:
- 論理演算: &&, ||, !, ~var_name
- 論理代入演算子:
||=, &&=, ??=
- ビット演算: &、|、^、~、<<、>>、>>>
(左端には0が埋められる)
複合演算子
- 複合代入演算子:
+=、‐=、*=、・=、%=, **=, &=, !=, ^=, <<=,
>>=, >>>=
- 条件演算子 (3項演算子):
exp1 ? exp2 : exp3
- ヌル関連演算子:
var2 = var1 ?? exp; // var1がnullやundefinedの場合にexpを、それ以外の場合はvar1を返す
-
その他演算子
-
typeof expression
-
delete var_name;
void function func() { } // 戻り値がundefined;
何も実行しないときに void(0) と書くjことがある
-
expression in object
-
var_name instanceof object_type // var_name が object_typeの印すっタンスかどうかを調べる
よく使う関数
- 開発者モードのコンソールにmessageを出力:
console.log(message);
- Javascriptのプログラム string を実行:
eval(string);
文字列
- "" あるいは '' で囲う
- エスケープ文字が使える: \n、\f、\b、\r、\t,, \', \"など
- `` で囲うとテンプレート文字列
変数 var_name の値は ${var_name} で参照できる。var_name は
javascript文でもよい
複数行
- 行末に \ を書く
- `` で行末\
無しで改行した場合、改行コードが挿入される
文字列関係
- 型変換: String(value);
- 文字列の長さ: myVar.length
- n番目の文字の取り出し: myVar.charAt(n)
- 部分文字列: myVar.substring(n1, n2) //
負の値を指定すると 0 とみなされる
- 部分文字列: myVar.slice(n1, n2) //
負の値を指定すると文字列の後ろから数えた文字を指す
- 部分文字列: myVar.substr(n1, len) //
負の値を指定すると文字列の後ろから数えた文字を指す
- 文字列の前後の空白を削除: myVar.trim()
- 文字列の前の空白を削除: myVar.trimStart()
- 文字列の後の空白を削除: myVar.trimEnd()
- 文字列の分割: myVar.split(seperator, limit)
- 文字列の連結: myVar.concat(str2, str3, ...)
- 繰り返しの文字列: myVar.repeat(n)
- 置換: myVar.replace(regexp, substitutionString)
- 置換: myVar.replaceAll(regexp, substitutionString)
- 大文字変換: myVar.toUpperCase()
- 小文字変換: myVar.toLowerCase()
- 最初の一致文字列の検索: myVar.indexOf(key [, from]) //
一致が見つからない場合は -1 を返す
- 最後の一致文字列の検索: myVar.lastIndexOf(key [, from]) //
一致が見つからない場合は -1 を返す
- 最初が str から始まっているか: myVar.startsWith(str)
- 最後が str で終わっているか: myVar.endsWith(str)
- strを含んでいるか: myVar.includes(str)
- 最初にマッチする文字列を返す: myVar.match(regexp)
- マッチする位置を返す: myVar.search(regexp)
- n番目の文字のUTF-16における文字コードを返す: myVar.charCodeAt(n)
- n番目の文字のUTF-16における文字コードを返す: myVar.codePointAt(n)
- 文字コード num? で指定した文字列を返す:
String.fromCharCode(num1, num2, ..., )
- 文字列の前方にパディング: myVar.padStart(len [, str])
- 文字列の広報にパディング: myVar.padEnd(len [, str])
HTMLタグ
- myVar.bold(), myVar.italics(), myVar.fixed(), myVar.big(), myVar.small(),
myVar.blink(), myVar.strike()
myVar.sup(), myVar.sub(), myVar.fontcolor(), myVar.fontsize(), myVar.anchor(),
myVar.link()
JSON
- JSONをオブジェクトに変換: JSON.parse(str)
- オブジェクトをJSONに変換: JSON.stringify(str)
Unicode
- 正規化: myVar.normalize([form])
Promize
Web制御