前回、『変数』の基本的な考え方と取り扱い方法について説明しました。
宣言と代入は何となく必要なことがわかった
でも後で代入するのなんで初期化しないといけないの?
妻の疑問のとおり、変数はどこかのタイミングで何かの値を代入するために宣言して使うことが多いです。
そのため、代入するまでその変数を使わなければプログラムの動きとしては問題ないかのように見えます。
でも結論からいうと、バグ(不具合)の温床になるので初期化はしないといけないんです。
今回は『変数』を必ず初期化しなければいけない理由について説明します。
初期化していない変数ってどういう状態?
変数を使う、というのは
・画面に変数の中身を表示させる
・変数の値と他の値で計算させる
・変数の値を文字列として結合させる
などです。
宣言だけして初期化していない変数は前回の例えに続き、スーパーマーケットいうと、
野菜売り場で「キャベツ(1玉)」と書いてあるスペースを見つけて近寄ったときに、肉とか魚とかゴミが無造作に置いてあるイメージです。
つまり、何が置いてある(入っている)かわからない状態です。
JavaScriptだと初期化していない変数はundefinedとあらわされます。
言葉の意味としては未定義です。
肉なのか魚なのかゴミなのか、もしかしたら半分のキャベツかもしれませんが、初期化していない変数は全部未定義とみなされます。
ちなみにC言語というプログラミング言語では同様に変数を宣言して初期化しないでいるとundefinedではなく、中に入っている値を見ることができたりします。(一部の変数を除く)
なぜ変数を初期化しなければならないのか
冒頭に書いた通り、バグ(不具合)の温床になるからです。
たとえば、以下のようなコードがあります。
var price;
price = 100;
宣言した直後に代入しているので大きな問題は発生しないです。
…今、このときは。
ところが、このプログラムに手を加える必要が出てきて、数か月後に他の誰かが、もしくは自分が以下のようにコードを追加したとします。
var price;
var new_price;
var total_price;
new_price = 120;
total_price = price + new_price;
priceとtotal_priceの初期化忘れですね。
上記の例はできるだけシンプルにしたつもりなので、
「こんなこと普通は気づくでしょ」とか
エラーが発生してもパッと見て「あ~ぁ」と気づきます。
しかし、複雑な処理になればなるほど、どこがバグの原因なのか特定することが難しくなります。
ちなみに上記の各変数を最後にconsole.logで表示させるとこのような結果になります。
price: undefined
new_price: 120
total_price: NaN
total_priceはundefined(よくわかんないもの)と120を足してしまったので、NaN(Not a Number)と表示されます。
まとめ
システムは小規模なものでもチーム(複数人)で開発することも多いです。
また、できあがってからも新しい機能を追加するなどして手を加えてアップデートすることもあります。
自分ひとりで作った時点のものが結果として完全なものではないことがほとんどです。
自分の書いたコードがバグの発生原因にならないように、誰がいつ見てもわかりやすいように変数の初期化は忘れずに行いましょう。
このテのバグが見つかると「誰だよ、こんなん書いたの」って後で笑われるから気をつけてね
1人で書いているとそういうのはイメージするのが難しそうだね、気をつける。