悠々字的

PCなどの話題が主になる予定です!

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;のように上書きしようとしても

エラーが出るようになりました。上書きされる心配なし!

配列に関しては上書きされるので注意が必要です・・・(後述しますが、配列の場合でも上書きされないようにすることもできます)

 

しかし、変数を宣言したい時にvarletのどちらで宣言したら?という話になりますね。

結論、新しく実装された宣言文のletでOKです。varは昔のコードと互換性を持たせる為に残されているんだとか。

 

なので使用率としては、const > let > var

ということになりそうです。

基本的に再代入する必要がない数の方が多いからです。(僕の場合ですが...)

varに関しては皆無に近いかもしれません。

 

letvarの違いはズバリ、スコープです。

宣言した変数の有効な範囲が異なります。

 

{

    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モードにしないと

コンソールエラーが出ないので注意!

 

変数か定数か宣言するだけでも意外と奥が深くて面白いですね!

まつわるネタがまだまだありそうです。

それではまた次回。ご覧頂きありがとうございます!