1. TOPTOP
  2. Webサービス
  3. JavaScript

GoogleのFirebaseで学習するJavaScriptの変数宣言子 ~ let, constの特徴とvarとの違い

|

javascript_var_let_const

2018年6月21日にプログラミング学習動画のドットインストールで、JavaScriptで学ぶFirebase入門(新しいタブで開く)というレッスンが公開されました。

“const”と”var” 2つの宣言子の使用例

const config = {
  apiKey: "hogehogefugafuga",
  authDomain: "myfirebasechatapp-hogehogefugafuga.firebaseapp.com",
  databaseURL: "https://myfirebasechatapp-hogehogefugafuga.firebaseio.com",
  projectId: "myfirebasechatapp-hogehogefugafuga",
  storageBucket: "myfirebasechatapp-hogehogefugafuga.appspot.com",
  messagingSenderId: "99999999999"
};

その動画の中でオブジェクト変数である”config”を宣言するために”const”という変数宣言子が使われています。動画で「”const”はJavScriptの新しい記法である」とさらっと説明されています。

var config = {
  apiKey: "hogehogefugafuga",
  authDomain: "myfirebasechatapp-hogehogefugafuga.firebaseapp.com",
  databaseURL: "https://myfirebasechatapp-hogehogefugafuga.firebaseio.com",
  projectId: "myfirebasechatapp-hogehogefugafuga",
  storageBucket: "myfirebasechatapp-hogehogefugafuga.appspot.com",
  messagingSenderId: "99999999999"
};

一方、GoogleのFirebaseで”Project Overview”を確認すると、導入用のスクリプトは変数宣言子として”var”が使われています。”var”はJavaScript学習者が必ず目にするおなじみの変数宣言子です。”const”と”var”はどのように違うのでしょうか?

“const”と”let”の特徴

const“とはECMAScript6(新しいタブで開く)の規格で採用されている宣言子で、定数を宣言するための記法です。またECMAScript6の規格で新しく採用されている宣言子には”let“もあり、変数を宣言するための記法です。ECMAScript5の規格である”var”は、定数・変数の両方の宣言を兼ねた宣言子でした。

“const”宣言子の特徴

constはブロックスコープで再代入ができないローカル変数(定数)です。

const c = 1;
c = 2;

const宣言子で代入された定数について、再代入をしようとするとエラーとして”Uncaught TypeError: Assignment to constant variable.“が表示されます。

const MY_ARRAY = [];
MY_ARRAY.push("A");
console.log(MY_ARRAY); // ["A"]

ただし、定数の値がオブジェクト型のデータ型(配列やオブジェクト)の場合、その要素やプロパティの値を変更することは可能です。

“let”宣言子の特徴

letは波括弧内を変数の有効範囲とするブロックスコープで、使い方は基本的に”var”と同じです。

function letTest() {
  let l = 1;
  if (true) {
    let l = 2;  
    console.log(l);  // 2
  }
  console.log(l);  // 1
}
letTest();

ただしletはブロックスコープの変数であるため、”{}(波かっこ)”の中では変数の値が変わることはありません。

function varTest() {
  var l = 1;
  if (true) {
    var l = 2; 
    console.log(l);  // 2
  }
  console.log(l);  // 2
}
varTest();

一方varは波括弧内でブロックされませんので、波括弧の途中で変数の値が入れ替わることがあります