# 変数したい(`const` / `let` / `var`) ```js // ES2015で追加 const c = 再代入できないオブジェクト let b = 再代入できるオブジェクト // ES2015以前(非推奨) var a = 任意のオブジェクト ``` `const`、`let`、`var`で変数を宣言できます。 `const`は再代入ができない変数、 `let`は再代入してもよい変数に使います。 `var`はどのような変数にも使うことができます。 :::{note} `const`と`let`はV8ランタイムから使えるようになりました。 `var`はそれ以前のGASから使うことができますが、現在では非推奨です。 ::: :::{hint} ``const``は「定数」というイメージがあったため、**あとから書き換えることができない**ように変数を宣言するときに使うものだと思っていましたが、大きく間違っていました。 あくまで**再代入を禁止**する宣言なので、オプジェクトのプロパティは変更できます。 ::: ウェブで検索したコード片には`var`や`const` / `let`が入り混じっています。 `var`で定義されている変数は、積極的に`const`に書き換えるとよいです。 もし、エラーがでる場合は`let`に置き換えましょう。 そして、プログラムが動けばOKとしましょう。 ## 初期化したい(`null` / `undefined`) ```ts let name: string = ""; let count: number = 0; let items: string[] = []; let items: [] as string[]; ``` 変数を宣言するときに初期値を設定できます。 TypeScriptでは型名も同時に指定します。 ```ts let user: User | null = null; ``` `null`は「値が空であること」を示す特殊な値です。 変数が「未設定」(かつ、あとから設定される)である場合に使うとよいです。 `undefined`は、変数やプロパティが「未定義」であることを示す値です。 変数名だけを定義した場合や、関数が値を返さない場合、 存在しないプロパティにアクセスした場合などに`undefined`となります。 ## 比較演算子したい(`===` / `==`) ```ts // nullを判定したい場合 if (name === null) { console.log("名前の設定が null です") }; // undefinedを判定したい場合 if (name === undefined) { console.log("名前の設定が undefined です"); }; // 同時に判定したい場合(例外処理) if (name == null) { throw new Error("Error: 名前が設定されていません") }; // 除外したい場合 if (name) { console.log(`名前が ${name} に設定されています`) } else { console.log("名前の設定が null もしくは undefined です") } ``` `null`や`undefined`はそれぞれ`===`演算子で判定します。 両方を同時に判定したい場合は`==`演算子を使います。 例外処理を発生させたい場合によく使います。 ## 分割代入したい ```js const person = { "name": "John Doe", "age": 999, } // オブジェクトを分割代入 // - 変数名はプロパティと同じにしなければならない const {name, age} = person; // 新しい変数名に分割代入 // - オブジェクトのキーはプロパティと同じにする // - 値を新しい変数名で受け取ることができる const {name: anotherName, age: anotherAge} = person; // 配列に分割代入 // - オブジェクトを配列で受け取ることはできない const [name, age] = person; // これはエラーになる ``` 複数のプロパティを持つオブジェクトを、アンパックした状態で受け取ることができます。 上のサンプルだとありがたみが分かりづらいですが、 オブジェクトを返り値に持つ関数を受け取るときに便利です。 ## 型変換したい ```js // 数値に変換 Number("123"); // -> 123(数値) Number("123abc"); // -> NaN(変換できない) Number(true); // -> 1 Number(false); // -> 0 // 文字列から数値を抽出 parseInt("42px"); // -> 42 parseFloat("3.14em"); // -> 3.14 // 文字列に変換 String(456); // -> "456"(文字列) String(true): // -> "true" String([1, 2, 3]); // -> "1,2,3" // 真偽値に変換 Boolean(1); // true Boolean(0); // false Boolean(""); // false(空の文字列はfalse) Boolean("hello"); // true Boolean([]); // true(空の配列はtrue) Boolean({}); // true(空のオブジェクトはtrue) // JSON形式の文字列に変換 const data = {...}; JSON.stringify(data); // 等価演算子/厳密等価演算子 5 == "5"; // true(暗黙の型変換) 5 === "5"; // false(暗黙の型変換されない) ``` 型を変換するメソッドも多数用意されています。 JSでは**暗黙の型変換**がデフォルトになっているのですが、これは予期せぬバグを引き起こす可能性があります。 とくに等価演算子を使って条件分岐する際は、 `===`(厳密等価演算子)を使うとよいと思います。