最近、 JavaScript
をガンガンやっているので、その時のメモ。
基本型 互いに別物
参照型 互いに同じ場所を見てる
配列内 → 要素
オブジェクト → プロパティ
関数 → メソッド
undefinedは変数の値が定義されてないことを表す値
nullは空であるという状態を表すための値
⚠️ 実際のアプリ開発でバグの原因になることも多い。
ex1)
バックエンドをrubyで実装している例。
nameの返り値がundefined
の場合、
rubyはfalse
同じくnameの返り値がnull
の場合は
rubyはtrue
name = params[:name] == '' ? nil : User.find(params[:name]).name
==演算子
はなんとか等しいと見なせないかとJSがあれこれ努力してくれる演算子なので、値の比較はなるべく===演算子
を使う。
JSでは、以下の値も暗黙的なfalseと見なされる。
上記以外の値はすべてがtrueとみなされます。
try {
例外が発生するかもしれない命令(群)
} catch(例外情報を受け取る変数) {
例外が発生した時に実行される命令(群)
} finally {
例外の有無にかかわらず、最終的に実行される命令(群)
}
finalllyはrubyのensure
に似てる
JSでオブジェクトを利用するためには、インスタンス化しなければならないが、JSでは、リテラルをそのまま対応する組込みオブジェクトとして利用できるので、インスタンス化をほとんど意識することがない。
const ary = []; // 空の配列を生成
オブジェクトリテラルは{}を書くことで、新しいオブジェクトを作成できます。オブジェクトリテラルはオブジェクトの作成と同時に中身を定義できます。 オブジェクトのキーと値を:で区切ったものを {} の中に書くことで作成と初期化が同時に行えます。
const object = {}; // 中身が空のオブジェクトを作成
const object = {
key: "value"
};
オブジェクトのkeyの参照方法
console.log(object.key); // => "value"
console.log(object["key"]); // => "value"
後入れ先出し(LIFO: Last In First Out)のデータ構造。アプリの操作履歴を保存し、最後に実行した操作をまず取りだすみたいな用途で使われる。
push、popメソッドで実装できます。
先入れ先出し(FIFO: First In First Out)。最初に入った要素を最初に処理する。食品の陳列に似てる。
push、shiftメソッドで実装できます。
• function命令(関数宣言) → 関数getTriangleを直接定義している
• 関数リテラル → 「function (base, height) {…}」と名前のない関数を定義したうえで、変数getTriangle
に格納している。
関数リテラルは、宣言した時点では、名前を持たないことから匿名関数
、または無名関数
と呼ばれる。
// function命令
function getTriangle(base, height) {
return base * height / 2
}
console.log('三角形の面積:' + getTriangle(5, 2));
// 関数宣言では"関数名"は省略できない
function 関数名() {
}
// 関数リテラル
const getTriangle = function (base, height) {
return base * height / 2;
};
console.log('三角形の面積:' + getTriangle(5, 2));
// 関数式は変数名で参照できるため、"関数名"を省略できる
const 変数名 = function() {
};
構文
(引数,...) => { ...関数の本体... }
const getTriangle = (base, height) => {
return base * height / 2;
}
console.log('三角形の面積:' + getTriangle(5, 2));
引数がない場合でも()
を省略することはできない。()
には関数を事項する
という意味も持っているから。
varだとブロックレベルのスコープが存在せず、ブロックを抜けたあとでも変数iが有効であり続ける。
if (true) {
var i = 5;
}
console.log(i); // => 5
letだとブロックスコープに対応した変数を宣言できる。
if (true) {
let i = 5;
}
console.log(i); // => error
「…」演算子は、実引数で利用することで、for ...of
ブロックで処理できるオブジェクトを個々の値に展開できます。
console.log(Math.max(...[15, -3, 78, 1])); //78
代入先の変数もブランケットでくくっているのがポイント。
let data = [56, 64, 94, 89];
let [x0, x1, x2, x3] = data
console.log(x0); // 56
console.log(x3); //89
最もシンプルなクラス。
変数Memberに対して、空の関数リテラルを代入しているだけだが、これがJavaScriptのクラス。
var Member = function() {};
このMemberクラスをインスタンス化するにはnew演算子
使う。
var menm = new Member();
JavaScriptの世界では、「いわゆる厳密な意味でのクラス」という概念は存在しない。
JavaScriptでは関数(Functionオブジェクト)にクラスとしての役割を与えてる。
同一のクラスを元に生成されたインスタンスであっても、それぞれが持つメンバーは同一であるとは限らない
DOMで、あるノードを基点として、相対的な位置関係からノードを取得すること。
同一の要素/同一のイベントに対して、複数のイベントがハンドラーを紐付けられない。
同一要素の同一イベントに対して複数紐づけられるのはイベントリスナー
addEventlistenerメソッド
elem.addEventlistener(type, listener, capture)
elem: 要素オブジェクト type: イベントの種類
lister: イベントに応じて実行すべき処理 capture: イベントの方向
• onloadイベントハンドラー → コンテンツ本体と全ての画像がロードされたところで実行 • DOMContentLoadedインベント → コンテンツ本体がロードされたところで実行(=画像のロードを待たない)
ページの初期化処理は、DOMContentLoadedイベントリスナーで表すのが基本
HTML文字列を埋め込む必要がない場合は、まずtextContentプロパティ
を優先して利用する。
(インスタンス)オブジェクトを初期化するメソッドのこと。コンストラクターの名前は、普通の(=コンストラクタでない)関数と区別するために大文字
で始めるのが一般的です。
コンストラクターに戻り値は不要
const Member = function (fistName, lastName) {
// thisはコンストラクターによって生成されるインスタンス(つまり、自分自身)
// thisに対して変数を指定することで、インスタンスのプロパティを設定できる
this.firstName = fistName;
this.lastName = lastName;
// getNameプロパティに関数リテラルを渡して、getNameメソッド的にを宣言
this.getName = function () {
return this.lastName + '' + this.firstName;
}
};
let mem = new Member('tarou', 'tanaka');
console.log(mem.getName());
プロパティの定義
this.プロパティ名 = 値;
JavaScriptにおいては、厳密にはメソッドという独立概念はなく、値が関数オブジェクトであるプロパティがメソッドとして見なされる
構文
throw new Error(エラーメッセージ)
関数を引数、戻り値として扱う関数のこと
this
はスクリプトのどこからでも参照できる特別な変数場所 | thisの参照先 |
---|---|
トップレベル(関数の外) | グローバルオブジェクト |
関数 | グローバルオブジェクト(strictモードではundefined) |
call/ applyメソッド | 引数で指定されたオブジェクト |
イベントリスナー | イベントの発生元 |
コンストラクター | 生成したインスタンス |
メソッド | 呼び出し元のオブジェクト(=レシーバーオブジェクト) |
プロトタイプにインスタンスを設定るすることで、インスタンス同士を「暗黙の参照」で連結し、互いに継承関係を持たせること。
イベントに対してその処理内容を定義するコードの塊(関数)のこと。
参考 改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで