見出し画像

JavaScriptの変数と定数

JavaScriptの変数の宣言について、まとめてみました。

1.変数とは

例えば中学校での数学の時間に

a=1
b=2
c=a+b
問:cの中の値はいくらでしょう?
答:

とあったとき答え3ですね。
aやbやcを「文字」とか「変数」とか説明を受けたかもしれません。「変数」は箱だと例える人がいます。箱の中にあらゆる数字(や文字など)を入れ替わり代入することで、プログラムの汎用性が広がります。

では、上の式をプログラムっぽくしてみます。

「変数」について、a,b,cといったものは予め用意してくれていません。箱を作るのにリソース(=メモリ)が必要だからです。

ですから変数を作る作業が必要です。これを「変数の宣言」と言います。

2.従来の変数の宣言「var」

変数のことを「variable」といいます。
例えば変数「a」を宣言するには、「変数のaを作る」→「variable a」→variableは長いので前3文字で「var a」となります。

プログラムのおしまいは「;(セミコロン)」をつけますので空っぽの「変数a」の宣言の式としては次のようになります。

var a;

ですので、最初の式は次のように置き換えられます。

var a=1
var b=2
var c=a+b
document.getElementById("output")=c;

「3」が出力されます。「=(イコール)」はJavaScriptでは等しいではなく「右のものを左に代入する」という意味です。

従来の変数はこれだけ覚えておけばOKでした。ところが・・・



3.変数の宣言「let」

変数宣言「var」から「let」に移行中です。

例えば、varをletにそのまま置き換えてみましょう。

let a=1
let b=2
let c=a+b
document.getElementById("output")=c;

「3」が出力されます。ではvarとletとの違いはなんでしょう。

var は再宣言ができますが、letは禁止されています。例えば

var a=1;
var a=2;
document.getElementById("output") = a;

「2」が出力されますが、

let a=1;
let a=2;
document.getElementById("output") = a;

aの値は出力されず、デベロッパツールにエラー(Uncaught SyntaxError: Identifier 'a' has already been declared)が表示されます。

例えば、複数人でプログラム開発をしている時、
・Aさんが変数aの値を1として、
・1万行下でBさんがAさんが変数aを指定しているのを知らずに、
 新たに変数aの値を2とすると、
誤った値「2」が表示されます。それはAさんが困ります、むしろエラーになったほうが「なんだなんだ?」とわかってよいですね。
ちなみに「let」というのは、「aを1にする」を英文では「let a be 1.」と書きます。「〜を〜にする」という動詞からだと思われます。


4.定数の宣言「const」

「const」は定数(constant variable)。「宣言後に勝手に値を変えられると困るような変数」に使用します。また宣言時には必ず値を代入します。例えば

①円周率の値が変えられたら困るから

const PI = Math.PI;

②取得した要素が入替わったら困るから。

 const element1 = document.getElementById("output1");

③NAKASHIMAという「もの」は決して変えたくないから。

const NAKASHIMA = {weight:65,height:185,age:35};

ただしそのプロパティ(体重、身長、年齢のこと)の値は変更可能です。

また「let」と同様に再宣言はできません。

const a = 1;
const a = 2;
document.getElementById("output") = a;

aの値は表示されず、開発者ツールのconsoleにエラー(Uncaught SyntaxError: Identifier 'a' has already been declared)が表示されます。

ちなみに、constは定数ですから、次のように値を変更することもできません。

const a = 1;
a=2;
document.getElementById("output") = a;

aの値はやはり、エラー(Uncaught TypeError: Assignment to constant variable.)となります。

また、定数は宣言した時に同時に値を代入しなければなりません。ですので、次の命令文はNGです。

const a;
a=2;
document.getElementById("output") = a;


5.スコープ

letとconst vs varの宣言では「スコープ」が関係してきます。
スコープとは関数やif文で使用するブロック「{〜}」の影響範囲と思ってください。
varは、宣言した「{〜}」の中外で有効できますが、
letやconstは「{〜}」の中でのみ有効です。

(1) 例えばvarの場合

var a=1;          //① 値を1に設定
function fn1(){var a=2;}  //② {〜}内で2にした
fn1();
document.getElementById("output")  = a; //①に②が影響して2になる

{〜}の外でも有効なので、「2」が表示されます。

(2) これが、letの場合だと

let a=1;         //① 値を1に設定
function fn1(){let a=2;}    //② {〜}内で2にしたが、{〜}内でのみ有効
fn1();           //③ 関数②の実行
document.getElementById("output")  = a; //①に②が影響せず1になる

「1」が表示されました。{〜}の中で変数宣言すると、それは{〜}の外で変宣言したlet変数とは、別のlet変数になり{〜}の中でのみ有効となります。

これらもやはり、使用できる範囲を狭めて、思わぬところで値が変わることを防止するためのようです。

ちなみに、{〜}の外で宣言したものはグローバル変数と呼ばれ、{〜}内にも影響します。

let a=1;        //① 値を1に設定
function fn1(){a=2;}   //② {〜}内でグローバル変数を2にした
fn1();           //③関数②の実行
document.getElementById("output")  = a; //①に②が影響して2になる

「2」が表示されます。ちなみに、{〜}内で宣言、影響するものをローカル変数といいます。

よく例えに出すのですが、「壁の外で生まれた巨人(フローバル変数)は壁の中に侵入できる、壁の中で生まれた人類(ローカル変数)は壁の外に出られない」でたら・・・と連想してもいいかもしれませんね。

6.どれを使用すべきか

現在の市販の教科書や過去の参考サイトでは、varを使用しているケースも多くありますので「var」で学びましょう。そして、変数は「let」、定数は「const」も学んでいきましょう。

使い方については、例えば、
・プログラム全体に影響する変数は定数「const」として値を代入して宣言する。例えば、要素取得して得られたものや、円周率の値など。
局所的なもので値が変わるものは変数「let」として宣言する。
・「var」は知識として過去のプログラムを理解する際に思い出す。
といったところでしょう。ただ、変数の使い分けについては様々な意見が公開されていますので、興味のある人はググってみてください。

【PR】

①初心者向けHTML5対面教室(東京・大阪)

②HTML5の検定にチャレンジ!(オンライン)



いいなと思ったら応援しよう!