2.1 変数の本質
変数は「値を格納する箱」と説明されることが多いですが、より正確には、値やメモリ上の場所に付けた名前です。
name = "Taro"
ここではnameという名前から文字列値を参照しています。
2.2 可変と不変
可変変数
一度代入した後も変更できます。
count = 1
count = 2
不変変数
一度値を決めた後、再代入できません。
let count = 1;
// エラー
count = 2;
Rustで変更可能にするには明示します。
let mut count = 1;
count = 2;
JavaScriptでは次の区別があります。
const count = 1;
let total = 0;
現代的な言語設計では、一般に次の考え方が強くなっています。
デフォルトは不変
必要な場所だけ可変
変更可能な状態を減らすと、プログラムの挙動を予測しやすくなるからです。
2.3 再代入と内部変更は別
JavaScriptのconstは、参照先オブジェクトの内部まで不変にするわけではありません。
const user = {
name: "Taro"
};
user.name = "Jiro"; // 可能
禁止されるのは変数への再代入です。
user = {
name: "Saburo"
};
// エラー
次の二つは区別しなければなりません。
変数の不変性
オブジェクト内部の不変性
2.4 値型と参照型
値をコピーするときの挙動も重要です。
値を複製する場合
a = 10
b = a
通常、aとbは独立した整数値として扱われます。
同じオブジェクトを参照する場合
a = [1, 2]
b = a
b.append(3)
print(a)
# [1, 2, 3]
aとbが同じリストを参照しているためです。
言語を比較するときは、次を確認します。
代入時に値がコピーされるか
参照がコピーされるか
明示的な複製が必要か