letで変数ならconstは定数!しかしconstには意外な盲点が?
現在のjavascriptでは、何かを宣言する際に
var,let,const
というキーワードを用います。
今回の記事の主役、3兄弟ですww
それぞれの意味が僕の中であやふやだった為、
自分用という意味も込め記事に起こします。
パターン1:numという7が入った変数を作りたい!
パターン2:numという7が入った定数を作りたい!(あとから上書きされないように)
パターン1は
var num = 7;
もしくは、
let num = 7;
でOKです。
パターン2は
const num = 7;
でOKです。
constで宣言した方はこれであとからnum = 77;のように上書きしようとしても
エラーが出るようになりました。上書きされる心配なし!
配列に関しては上書きされるので注意が必要です・・・(後述しますが、配列の場合でも上書きされないようにすることもできます)
しかし、変数を宣言したい時にvarとletのどちらで宣言したら?という話になりますね。
結論、新しく実装された宣言文のletでOKです。varは昔のコードと互換性を持たせる為に残されているんだとか。
なので使用率としては、const > let > var
ということになりそうです。
基本的に再代入する必要がない数の方が多いからです。(僕の場合ですが...)
varに関しては皆無に近いかもしれません。
letとvarの違いはズバリ、スコープです。
宣言した変数の有効な範囲が異なります。
{
var num = 7;
}
のように書くと、{ }の外、すなわちブロックの外でも
numが普通に使えてしまいますが、
{
let num = 7;
}
のように記述すれば、{ }の外ではnumは使用できません。
ローカルな変数として使えますね。
とうことは…スコープを狭くすることによってバグの可能性を
減らせます!!やったね!!
さて残るはconstで宣言した配列を上書きできてしまう件についてですが…フリーズという処理を行うことで中身を不変にできます。
配列の中身を不変にしたい場合、constで宣言するだけでは不十分
という事ですね。
const num = [1, 2, 3]
num[0] = 2;
と記述すると「constでnum配列が宣言されているから、きっとこの配列の要素は1,2,3の3つ、配列長も3で固定なんだ!」
って僕は最初思っちゃいましたが…
普通に代入できましたΣ(゚д゚;)
なのでnum配列の要素は2,2,3ですね。
不変にしたい場合は、
const num = [1, 2, 3]
Object.freeze(num);//追加した行
num[0] = 2;
これでOKです。numの中身は1,2,3のままです。
"use strict";を記述してstrictモードにしないと
コンソールエラーが出ないので注意!
変数か定数か宣言するだけでも意外と奥が深くて面白いですね!
まつわるネタがまだまだありそうです。
それではまた次回。ご覧頂きありがとうございます!