---
type: errors
language: javascript
slug: assignment-to-constant-variable
title: "TypeError: Assignment to constant variable."
title_tag: "TypeError: Assignment to constant variable. の直し方"
summary: >
  const で宣言した変数に代入し直すと出ます。const が固定するのは「値」ではなく「結びつき」で、
  配列やオブジェクトの中身は変えられます。その線引きと直し方を実行して確かめます。
description: >
  const が固定するのは値ではなく名前との結びつきです。配列やオブジェクトの中身は変えられます。for の書き方、Object.freeze との違い、直したコードまで実行して示します。
status: published
difficulty: 1
minutes: 8

versions:
  verified: "Node 22.22.3"
  since: "ES2015"
  deprecated: null
  removed: null

sources:
  - title: "Let and Const Declarations — ECMAScript® 2026 Language Specification"
    url: "https://tc39.es/ecma262/#sec-let-and-const-declarations"
  - title: "Object.freeze — ECMAScript® 2026 Language Specification"
    url: "https://tc39.es/ecma262/#sec-object.freeze"
  - title: "TypeError: invalid assignment to const \"x\" — MDN"
    url: "https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Errors/Invalid_const_assignment"

terms: [束縛, 再代入, 凍結, strict モード]

links:
  related:
    - javascript/errors/cannot-access-before-initialization
    - javascript/how-to/object/merge
    - javascript/reference/array/slice
    - javascript/learn/object/basics

content_updated_at: 2026-09-08
published_at: 2026-09-08
---

`const` で宣言した変数に、**もう一度代入した**ときに出ます。

```js bad
const count = 1;

count = 2;
```
```output
TypeError: Assignment to constant variable.
```

直し方は[num:2]つです。**入れ直すなら `let`、入れ直さないなら中身を変えます。**

```js run
let count = 1;

count = 2;

console.log(count);
```
```output
2
```

## `const` が固定しているもの

**`const` が固定するのは[key:名前と値の結びつき]で、値そのものではありません。**

配列やオブジェクトなら、[em:中身は変えられます]。

```js run
const list = [1, 2];
const config = { retry: 1 };

list.push(3);
config.retry = 5;

console.log(list);
console.log(config);
```
```output
[ 1, 2, 3 ]
{ retry: 5 }
```

**エラーになりません。** `list` が指している配列は同じままで、その中身を変えただけだからです。

一方、丸ごと別のものに差し替えると落ちます。

```js bad
const list = [1, 2];

list = [3];
```
```output
TypeError: Assignment to constant variable.
```

| やること | `const` で |
|---|---|
| `x = 別の値` | [bad:エラー] |
| `x.prop = 値` | できる |
| `x.push(値)` | できる |
| `x[0] = 値` | できる |

## 中身も変えたくないなら

`Object.freeze()` で[type:凍結]します。

```js run
const config = Object.freeze({ retry: 1 });

config.retry = 5;

console.log(config);
console.log(Object.isFrozen(config));
```
```output
{ retry: 1 }
true
```

**代入は無視されただけで、エラーは出ていません。**
気づかないまま「設定が反映されない」ことになります。

`'use strict'` の中なら、はっきり落ちます。

```js run
'use strict';

const config = Object.freeze({ retry: 1 });

try {
  config.retry = 5;
} catch (error) {
  console.log(error.name + ': ' + error.message);
}
```
```output
TypeError: Cannot assign to read only property 'retry' of object '#<Object>'
```

**文言が違うことに注意してください。** こちらは `Assignment to constant variable.` ではありません。

> `import` / `export` のあるファイル（モジュール）は、書かなくても strict モードです。
> **実務では落ちるほうが普通**だと思ってください。

[dim:`Object.freeze()` が固めるのは1段だけです。中の入れ子は凍りません。]

## 原因: `for` の書き方

```js bad
for (const i = 0; i < 2; i++) {
  console.log(i);
}
```
```output
0
TypeError: Assignment to constant variable.
```

**1回だけ回って落ちます。** `i++` が代入だからです。

`for...of` なら `const` で書けます。**繰り返しごとに新しく作られる**ので、代入になりません。

```js run
for (const n of [1, 2]) {
  console.log(n);
}
```
```output
1
2
```

| 書き方 | `const` |
|---|---|
| `for (let i = 0; ...)` | [bad:使えない]。`let` を使う |
| `for (const x of ...)` | 使える |
| `for (const k in ...)` | 使える |

## 原因: あとで入れるつもりだった

```js bad
const result = null;

if (true) {
  result = '見つかった';
}
```
```output
TypeError: Assignment to constant variable.
```

**あとから入れるなら `let` です。** ただ、多くの場合は書き換えずに済みます。

```js run
const result = true ? '見つかった' : null;

console.log(result);
```
```output
見つかった
```

[em:入れ直さない形に書けるなら、そのほうが安全です。]
どこで値が変わったか探さなくて済みます。

## 似ているエラーとの違い

| 文言 | いつ出るか |
|---|---|
| `Assignment to constant variable.` | **`const` の変数**に代入した |
| `Cannot assign to read only property 'x' of ...` | **凍結したオブジェクト**の中身に代入した（strict） |
| `Cannot access 'x' before initialization` | 宣言より[key:前]で使った → [別ページ](/ja/javascript/errors/cannot-access-before-initialization/) |
| `x is not defined` | そもそも宣言していない |

[dim:このページの実行結果は Node 22.22.3 のものです。文言は処理系と版によって変わります。自分の環境で出た文言で検索してください。]

## 探しかたの順序

1. エラーの行で**代入している変数名**を見る
2. その変数の宣言を探す。`const` になっているはず
3. **入れ直す必要が本当にあるか**考える
   - ある → `let` にする
   - ない → 中身を変えるか、[key:三項演算子]で1回で決める

## まとめ

- `const` が固定するのは[key:結びつき]。**値の中身ではない**
- 配列やオブジェクトの[em:中身は変えられる]
- 中身も守るなら `Object.freeze()`。**ただし黙って無視される**（strict なら例外）
- `for (const i = 0; ...)` は書けない。`for...of` なら書ける
- 入れ直さない形にできるなら、そのほうがよい

`const` にした配列やオブジェクトの中身を、元に影響させずに変えたいときは、複製のしかたを知っておくと早く済みます。
→ [オブジェクトを結合する](/ja/javascript/how-to/object/merge/)
