本記事では、GAS(GoogleAppScript)・JavaScriptにおける変数定義(var / let / const)の使い分けについてまとめました。
自分自身がGASでコードを書いている際によく迷ったので、同じような方の参考になれば幸いです。
GAS と JavaScript における違い
まず、「GASとJavaScriptでは、変数定義の使い分けに違いがあるのでは?」と思うかもしれないが、違いはない。
GASはJavaScript(特にES5時代)をベースにして作られているため、文法はほとんど同じ。更に、"V8ランタイム"のおかげで最新のJavaScriptの文法も大体使えるようになっている。(ただし全く同じではない)
そのため、変数定義に関してもJavaScriptとGASで差はない。
よくある誤解
var / let / constの違いを、なんとなく「constは不変、let・varは変更可」みたいに思ったことはないだろうか。(自分はずっとこう捉えていた...)
これでも別に間違ってはいないのだが、以下のような誤解が生まれやすい。
-
constは不変 →constは中身の変更もできない(例:配列をconstで定義すると要素の追加はできない) -
varとletは変更可 →varとletの働きは同じだからどっちを使っても良い
↑これらは大きな間違いなので注意!!
結論だけ言うと、配列などでもconstが基本・varはほとんど使わないという理解が適している。
細かい理由をこれから説明していく。
const とは
const = 再代入ができない定義方法。
基本的にこれを使う。
ここで注意が必要なのは、「再代入」ができないだけで、「中身の変更」は可能であるという点である。
例えば配列で「中身の変更」を行っても、変数が呼ばれたときに参照する配列は定義したときの配列から変わらない。そのため、constで定義していても中身の変更はできる。
const arr = [];
arr.push(1); //OK
arr[0] = 2; //OK
arr = [1, 2, 3]; //これは再定義なのでエラー
let と var とは
let = 再代入可能な定義方法。
主にfor文のカウンターや、状態を更新する変数に使う。
varも再代入可能だが、letとは以下のような違いがあるため基本的に使用しない。
| スコープ | 再宣言 | |
|---|---|---|
| let | ブロック | ✕ |
| var | 関数 | 〇 |
スコープ
letは{}の中でのみ有効で、varは関数内でずっと有効になる。つまりvarはブロックを無視するため、使用するとバグが起こりやすくなってしまう。
if (true) {
var x = 1;
}
console.log(x); // 1 ← 外に出てくる
if (true) {
let y = 1;
}
console.log(y); // ReferenceError ← 外に出ない
再宣言
letは再宣言できないが、varは再宣言することができる。同じ変数名を上書きしてもエラーにならないvarは危険。
var a = 1;
var a = 2; // OK
let b = 1;
let b = 2; // Error: Identifier 'b' has already been declared
※再宣言と再代入は言葉が似ているが、別の操作。
- 再宣言 → 同じ名前の変数をもう一度宣言
let a = 1; // 宣言
let a = 2; // 再宣言
- 再代入 → すでにある変数に新しい値を入れる
let a = 1; // 宣言
a = 2; // 再代入
結論
- 基本は
const - ループ時など再代入が必要な時のみ
let varは危険なので使わない
という使い分けをすれば安全。
さいごに
今回はGASでもよく迷うvar / let / constの使い分けについてまとめました。
シンプルなルールさえ意識すれば安全なコードを書けるようになります。
迷ったとき参考にしていただければ幸いです。