変数は、数値や文字列などのデータを入れておける箱です。
プログラミングをはじめて、最初のほうで覚えるものですが、変数は意外と奥が深いものです。
そこで今回は、JavaScriptにおける変数の使い方を、多少のおふざけも混ぜて、詳しく紹介していきたいと思います。
分かりやすく、対話形式で解説していきます。
JavaScriptの基本編は、こちらの記事を御覧ください。
師匠! 今回もJavaScriptの解説お願いします!
あら、久しぶりね。前回教えたことは覚えてる?
はい、覚えてます! JavaScriptで……えっと、カレーを作るんでしたっけ?
そうそう、JavaScriptで美味しいカレーの作りかた……
……って、全く覚えてないだろー!!!(蹴
ぎえええええええっっ!
今回は前回の講座の、変数の使い方部分をより詳しく解説していくわよ!
※JavaScriptでカレーは作れません。
変数の使い方
まずは変数の使い方について、おさらいしておきましょう。
前回も勉強したけど、変数の使い方は覚えてる?
覚えてますとも。変数は箱みたいなもので、いろんな値を入れておけるんでしたね!
そうそう。たとえば、変数animal
に"dog"
を代入するならこういうふうね
sample.js
animal = "dog";
console.log(animal);
実行結果
dog
変数の宣言、なんてのもありましたね
変数の宣言にはvar
を使うわ!
sample.js
var animal;
animal = "dog";
console.log(animal);
実行結果
dog
変数の宣言と代入を同時にすることも可能よ!
sample.js
var animal = "dog";
console.log(animal);
実行結果
dog
変数の宣言
つづいて変数の宣言方法を見ていきましょう。
変数を宣言するときはvar
も使えるんだけど、でも最近はvar
よりもconst
やlet
の方が便利だから、そっちを使う人の方が多いと思うわ
えぇっ、var
なんて覚える必要なかったんですか!?
でも、JavaScriptの勉強しようとしてると、varで宣言されてるものも多いのよconst
やlet
を使えばいいと思うけど、ソースを読むためにはvarも覚えておく必要があるってことね
var
var
による変数宣言の方法です。
var
は前回も使いましたね!
うん。だからこれは前回のおさらいね
sample.js
var animal = "dog";
console.log(animal);
実行結果
dog
animal
という変数をvar
で宣言して、そのなかにdog
を代入console.log()
で、animal
に入ってるものをコンソールに表示しているんですね
const
つづいて、const
による変数宣言の方法です。
さっきの例で、そのままconst
を使ってみるわ!
sample.js
const animal = "dog";
console.log(animal);
実行結果
dog
ただvar
をconst
に変えれば使えるんですね
let
つづいて、let
による変数宣言の方法です。
こんどはlet
を使ってみるわよ
sample.js
let animal = "dog";
console.log(animal);
実行結果
dog
おなじようにvar
をlet
に変えれば使えるんですね
var、const、letの違いについて
つづいて、var
、const
、let
の違いを見ていきましょう。
ちょっと待ってください、師匠!var
、const
、let
、いったいなにが違うんですか?
そうね……いろいろ違うわ
たとえば?
変数の値を変更できるかどうかの違い
変数を宣言するときに使う、var
、const
、let
ですが、変数をあとから変更できるかどうかの違いがあります。
var
やlet
は代入した値をあとから変更することができるんだけど、const
はできないの
そんな! 変数の値を変更できなかったら困らないですか?
逆に間違って変数を書き換えちゃうようなバグを防げるのよ
へんへんうるさいわね……でもconst
で宣言されたものは変数っていうよりも定数って言ったほうがいいのかな
定数!?
うん。定数は値が一定のものね
JavaScriptのconst
は、正確にはちょっと定数と違うんだけど……これを解説しようと思うとよけいに混乱しちゃうから、とりあえず、const
は値が変更できない変数って覚えておいて
じゃあ、const
で宣言された変数の値を変えようとするとどうなるんですか?
やってみる?
sample.js
const animal = "dog";
animal = "cat";
console.log(animal);
実行結果
Uncaught TypeError: Assignment to constant variable.
at script.js:2
これはconst
で宣言した変数animal
に"dog"
を代入しておいて、次に"cat"
を代入しようとしたものよ
実行結果がエラーになってる!
ふふっ、値を書き換えたくないものはconst
を使っておけば、間違えちゃったときにエラーになって、バグを防げるでしょ?
そういうことだったのか!
有効範囲(スコープ)の違い
変数の有効範囲(スコープ)の違いがあります。
使える範囲があるんですか?
そうなの。使える範囲を制限することで、間違えて同じ名前の変数を作っちゃった、とか、そういったバグが防げるのよ
なるほど。お風呂にはいるとき、履いていたパンツと着替えのパンツを同じところに置いておくと、どっちがどっちだか分からなくなるのと一緒ですね
そうそう。ちゃんと決めたところに置いておかないと、たまに帽子と間違える……
……それはないでござる
あ、あんたに合わせたのよ
それより、スコープについての違いの例は、こんな感じね
sample.js
var x = 24;
if ( x === 24 ) {
var y = 30;
}
console.log(x);
console.log(y);
実行結果
24
30
これはvar
を使って変数を宣言してるんですね
xが24のとき、yに30を代入。実行結果は予想通りにxとyの値が表示されていますね
じゃあ、var
じゃなくてlet
を使ってみるわね
sample.js
let x = 24;
if (x === 24) {
let y = 30;
}
console.log(x);
console.log(y);
実行結果
24
script.js:8 Uncaught ReferenceError: y is not defined
at script.js:8
さっきのvar
をlet
に変えただけじゃないですか
実行結果も同じ……
……あれ? エラーになってる!
そう。y
はif
文の{}
のなかで宣言されてるでしょ?
だからy
は、{}
の外から呼び出すことができないの
いまはlet
を使ったけど、const
でも同じ結果になるわ!
でも、var
を使ったときは呼び出せましたよね
それがvar
と、let
やconst
の、有効範囲(スコープ)の違い。一見、var
のほうが便利そうだけど、有効範囲を制限できるlet
やconst
のほうが、あとからプログラムが複雑になりにくいの
あと、var
でも関数に関してはスコープが有効になるわ
sample.js
function test() {
var x = 1;
console.log(x);
}
test();
console.log(x);
実行結果
1
script.js:7 Uncaught ReferenceError: x is not defined
at script.js:7
つまり、簡潔に言うと、let
やconst
はブロックでスコープが有効、var
は関数でスコープが有効、ってこと
変数の複数回宣言の違い
変数は、同じブロックで複数回宣言すると、エラーになる場合があります。
じゃあ、このソースを見て
sample.js
var x = 10;
var x = 15;
console.log(x);
実行結果
15
var
で宣言したx
に10を代入して、もういちどx
を宣言しなおしてるんですね
結果はあとから代入した15が表示されていますね
でもlet
を使うとこうなるの
sample.js
let x = 10;
let x = 15;
console.log(x);
実行結果
Uncaught SyntaxError: Identifier 'x' has already been declared
あ、エラーになってますね
そう。let
は同じ変数を同じスコープで2度宣言してしまうと、エラーになるの
もちろん、const
でもエラーになるわ
こうやって、バグを防ぐんですね
ブロックスコープとは?
つづいて、ブロックスコープについて詳しく見ていきましょう。
りこ師匠。さっき言ってた、let
やconst
はブロックでスコープが有効、っていうのの、ブロックってどういうことですか?
もともとJavaScriptにはブロックスコープがなかったの。それが今はlet
やconst
ができて、ブロックスコープが使える様になったわけね
ブロックってのは、{}
で囲われた部分のこと。if
文は{}
で囲うでしょ? まぁ、さっきはとりあえずif
文を使ったんだけど、本当は{}
だけでいいの
というと?
つまり、こういうこと
sample.js
let x = 5;
{
let x = 17;
}
console.log(x);
実行結果
5
へぇ。{}
を書くだけで有効範囲がつくられるのかlet
を使っていれば、{}
のなかで代入しても、外には影響しないんですね
即時関数!?
即時関数っていうのは、こういうの
sample.js
var x = 5;
(function (){
var x = 17;
})();
console.log(x);
実行結果
5
うん。そういうこと
文字列の中で変数を使う
前回やった文字列の計算は覚えてる?
はい。文字列同士で足し算ができるんでしたよね
sample.js
const name = 'りこ';
console.log('私の名前は' + name + 'です。');
実行結果
私の名前はりこです。
JavaScriptでは、文字列同士を「+
」を使って足し算することができるの
だけど、こんな方法もあるわ!
sample.js
const name = 'りこ';
console.log(`私の名前は${name}です。`);
実行結果
私の名前はりこです。
文字列を囲う時に、シングルクォーテーション('
)やダブルクォーテーション("
)の代わりに、バッククォート(`
)を使うの
そして、${}
の中に変数名を入れれば、その変数に代入されている値を表示することができるわ
へぇ、こんな方法もあるんですね!
まとめ
今回はJavaScriptでの変数の使い方を、詳しく解説しました。
りこ師匠!!今日師匠に教えて貰ったことを使って、ソース書きました。見てください!
あ、すごーい。見せて!
これです。毎日書いていこうと思います
sample.js
{
const panty = "ピンク";
console.log(`りこ「昨日の私のパンツは${panty}です。」`);
}
{
const panty = "白";
console.log(`りこ「今日の私のパンツは${panty}です。」`);
}
実行結果
りこ「昨日の私のパンツはピンクです。」
りこ「今日の私のパンツは白です。」
そうそう、今日のあたしのパンツは……
……って、なんじゃこのプログラムは!!! (蹴
てか、なんであたしに言わせてんだよ!!! (蹴
それ以前に、なんでパンツの色知ってんだよ!!!! (蹴
てめー、ミキサーにかけるぞ!! (蹴 (蹴 (蹴
ぎえええええええええええええっ! ふざけすぎた。一週間は口をきいてくれないだろうな……
このシリーズの一覧はこちら
- JavaScriptマンガ風講座。初心者でも絶対に理解できる入門編!!
- 【初心者向けJavaScrip入門】変数を使いこなすための、かなり詳しい解説