okinawa

勉強メモ

JavaScriptメモ

参考

jsprimer.net

基本

ECMAScriptJavaScriptの中のどの実行環境でも共通する部分。

"use strict";基本的には常に使う。

宣言

const 再代入できない変数。厳密には定数ではないらしい。

let 再代入可能な変数。初期値を指定しない変数も定義できます。 初期値が指定されなかった変数はデフォルト値としてundefinedという値で初期化されます。

varは使わない。同じ名前の変数名を定義できたり、巻き上げやら色々問題があるらしい。

varが危険な理由。宣言だけがスコープの先頭に巻き上げられ、代入はその位置のままだから。

データ型

int/doubleがない。数字は基本Number型。

JavaScriptのデータ型はプリミティブ型とオブジェクト型の2つ。ラッパークラスもオブジェクト。

NaNとはNot a Numberのこと。Number型と互換性のない性質のデータをNumber型へ変換した結果はNaNとなります。

演算子

** べき乗演算子

=== 厳密等価演算子 同じ参照値かを判定

== 等価演算子 値が同じかを判定。型が違くても等価判定!使わないでおこう。

// 文字列を数値に変換してから比較
console.log(1 == "1"); // => true

例外的に、等価演算子(==)が使われるケースとして、nullとundefinedの比較があります。

文字列

シングルクォートとダブルクォートは全く同じ。

テンプレートリテラルはバッククォート。改行も反映される。

// 改行も反映される
contst str =
 `名前は${name}です。
年齢は${age}です。`;

オブジェクト

オブジェクトのプロパティの追加

// `key`プロパティを追加して値を代入
obj.key = "value";

オブジェクトのプロパティの削除

// プロパティの削除
delete obj.key;

配列は可変長。あとから要素足せる。オブジェクトと一緒。array.push(1)など。

例外処理

console.errorでスタックトレース

非同期処理の例外処理

tryブロックはそのブロック内で発生した例外をキャッチする構文です。 しかし、非同期処理は同期処理の後に完了します。非同期処理が実行されて例外を投げるのは、すべての同期処理が終わった後となります。つまりcatchできない。

エラーファーストコールバック。非同期処理中に発生した例外を扱う仕様。

fs.readFile("./example.txt", (error, data) => {
    if (error) {
        // 読み込み中にエラーが発生しました
    } else {
        // データを読み込むことができました
    }
});

暗黙的な型変換

JavaScriptでは、エラーが発生するのではなく、暗黙的な型変換が行われてしまうケースが多くあります。

暗黙的に変換が行われた場合、プログラムは例外を投げずに処理が進むため、バグの発見が難しくなります。 このように、暗黙的な型変換はできる限り避けるべき挙動です。

// 暗黙的な型変換が行われ、数値の加算として計算される
1 + true; // => 2

関数

関数を変数に代入

次のコードでは、定義したfn関数をmyFunc変数へ代入してから、呼び出しています。

function fn() {
    console.log("fnが呼び出されました");
}
// 関数`fn`を`myFunc`変数に代入している
const myFunc = fn;
myFunc();

匿名関数

名前を持たない関数を変数に代入できます。

// 関数式は変数名で参照できるため、"関数名"を省略できる
const 変数名 = function() {
};
// 関数宣言では"関数名"は省略できない
function 関数名() {
}

その他

JavaScriptは静的スコープ。ある変数がどの値を参照するかは実行前(静的)に決まる。

クロージャー(関数閉包)とは。クロージャーは「静的スコープ」と「参照され続けている変数のデータが保持される」という2つの性質によって成り立っています。

クラス宣言。

class MyClass { }

getter setter

class クラス {
    // getter
    get プロパティ名() {
        return 値;
    }
    // setter
    set プロパティ名(仮引数) {
        // setterの処理
    }
}
const インスタンス = new クラス();
インスタンス.プロパティ名; // getterが呼び出される
インスタンス.プロパティ名 = 値; // setterが呼び出される