const と参照
このレッスンで分かること
constが禁止しているのは再代入だけで、中身の変更は禁止していません- 配列とオブジェクトは、変数に入っているのが値ではなく置き場所です
const で宣言した配列が、勝手に伸びる
const は再代入できない宣言だと習いました。ところが、次のコードはエラーになりません。
JavaScript
const skills = ["HTML", "CSS"];
skills.push("JavaScript");
console.log(skills); // ["HTML", "CSS", "JavaScript"]const で宣言したのに、中身が増えました。一方でこちらは止まります。
JavaScript
skills = ["React"]; // TypeError: Assignment to constant variable.中身を変えるのは通り、変数そのものに別のものを入れ直すのは通らない。この境界線がこのレッスンのテーマです。const は constant の略ですが、正確な意味は「再代入できない変数」であって「中身が絶対に変わらない値」ではありません。
変数に入っているのは、値か置き場所か
なぜ違いが出るのか。答えは「変数の中に何が入っているか」にあります。
| 分類 | 型 | 変数に入るもの | 中身を変えられるか |
|---|---|---|---|
| プリミティブ | 数値 文字列 真偽値 null undefined | 値そのもの | 変える手段がない |
| オブジェクト | オブジェクト 配列 関数 | 置き場所 (参照) | 変えられる |
数値や文字列は、変数の中に値そのものが入っています。値を変える方法は再代入しかなく、その再代入が禁止されているので、結果として絶対に変わりません。配列やオブジェクトは実体が別の場所に置かれ、変数にはそこへの案内札だけが入ります。
JavaScript
const profile = { name: "山田 太郎" };
profile.name = "山田 太郎 (改訂)"; // 通る 案内札の先を書き換えている
profile = { name: "別の人" }; // 止まる 案内札を貼り替えようとしている住所を書いたメモを想像してください。
constはメモに別の住所を書き直すことを禁止します。しかし、その住所の家の中で模様替えをすることまでは止められません。
同じ場所を指す 2 つの変数
参照だと分かると、次の挙動にも納得がいきます。
JavaScript
const a = { name: "山田 太郎" };
const b = a;
b.name = "佐藤 花子";
console.log(a.name); // 佐藤 花子 a も変わっているconst b = a; は中身をコピーしたのではなく、同じ場所を指す札をもう 1 枚作っただけです。関数に配列やオブジェクトを渡すのも同じことで、渡した先で push すれば呼び出し元の配列が伸びます。事故の種でもありますが、逆に言えば「受け取った配列にそのまま足して返す」関数は、この性質の上に成り立っています。
よくある間違い
constなら安全だと思い込む — オブジェクトを関数に渡すことは、書き換える権利を渡すことでもあります。渡した先で何をされるか分からないなら、コピーを渡すほうが安全です- 見た目が同じオブジェクトを
===で比べる —{ a: 1 } === { a: 1 }はfalseです。中身が同じかではなく、同じ実体かを見ているためです
要件
- 関数名は
addWork、引数はworksとtitleとyearの 3 つ { title, year }の 2 つのキーを持つオブジェクトをworksの末尾にpushすること- 戻り値は追加後の
works配列そのもの - 配列を作り直さず
pushを使うこと
入出力例
addWork([], "プロフィールサイト", 2026) → [{"title":"プロフィールサイト","year":2026}]
addWork([{"title":"プロフィールサイト","year":2026}], "自己紹介カード", 2026) → [{"title":"プロフィールサイト","year":2026},{"title":"自己紹介カード","year":2026}]
addWork([{"title":"プロフィールサイト","year":2026},{"title":"自己紹介カード","year":2026}], "スキル一覧の表", 2026) → [{"title":"プロフィールサイト","year":2026},{"title":"自己紹介カード","year":2026},{"title":"スキル一覧の表","year":2026}]
addWork([], "", 2026) → [{"title":"","year":2026}]ヒント
編集 ゆめさく編集部