---
type: errors
language: javascript
slug: invalid-array-length
title: "RangeError: Invalid array length"
title_tag: "RangeError: Invalid array length の原因と直し方"
summary: >
  new Array() や length への代入に、負の数・小数・NaN・大きすぎる数を渡すと出ます。
  許される範囲、new Array(3) と Array.of(3) の違い、計算結果が NaN になる経路まで確かめます。
description: >
  長さは 0 以上 2^32-1 未満の整数だけです。負の数・小数・NaN で落ちます。
  new Array(3) と Array.of(3) の違い、長さが NaN になる典型的な経路まで実行して示します。
status: published
difficulty: 2
minutes: 7

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

sources:
  - title: "Array Objects — ECMAScript® 2026 Language Specification"
    url: "https://tc39.es/ecma262/#sec-array-objects"
  - title: "ArraySetLength — ECMAScript® 2026 Language Specification"
    url: "https://tc39.es/ecma262/#sec-arraysetlength"
  - title: "RangeError: invalid array length — MDN"
    url: "https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Errors/Invalid_array_length"

terms: [長さ, 疎な配列, 型変換]

links:
  related:
    - javascript/learn/array/basics
    - javascript/how-to/array/chunk
    - javascript/errors/is-not-a-function

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

配列の長さになれない数を渡すと出ます。

```js bad
new Array(-1);
```
```output
RangeError: Invalid array length
```

**長さは[num:0]以上、2の32乗未満の整数だけ**です。それ以外は全部これになります。

## 何が通って、何が落ちるか

```js run
for (const value of [0, 3, -1, 1.5, NaN, 2 ** 32, 2 ** 32 - 1]) {
  try {
    console.log(String(value).padEnd(12), '-> length', new Array(value).length);
  } catch (error) {
    console.log(String(value).padEnd(12), '->', error.name);
  }
}
```
```output
0            -> length 0
3            -> length 3
-1           -> RangeError
1.5          -> RangeError
NaN          -> RangeError
4294967296   -> RangeError
4294967295   -> length 4294967295
```

- 負の数 … [bad:落ちる]
- 小数 … [bad:落ちる]（`1.5` は整数ではない）
- `NaN` … [bad:落ちる]
- 2の32乗ちょうど … [bad:落ちる]。**1つ手前までが上限**

## 原因1: 計算結果が `NaN` になっている

**実務でいちばん多い形です。**

```js run
const total = Number('三件');
const size = 2;

console.log(total);
console.log(Math.ceil(total / size));
```
```output
NaN
NaN
```

`Number()` が `NaN` を返し、そのまま長さに使われています。

```js bad
const count = Number('三件');

new Array(count);
```
```output
RangeError: Invalid array length
```

**落ちた場所ではなく、`NaN` が生まれた場所を探してください。**
→ [文字列を数値に変換する](/ja/javascript/how-to/string/to-number/)

`NaN` かどうかは `Number.isNaN()` で確かめます。

```js run
function makeSlots(count) {
  if (!Number.isInteger(count) || count < 0) {
    throw new RangeError(`件数が数値ではありません: ${count}`);
  }

  return new Array(count).fill(null);
}

console.log(makeSlots(3));

try {
  makeSlots(Number('三件'));
} catch (error) {
  console.log(error.name + ': ' + error.message);
}
```
```output
[ null, null, null ]
RangeError: 件数が数値ではありません: NaN
```

**自分で投げるほうが、原因がその場で分かります。**

## 原因2: 引き算で負になった

```js run
const total = 3;
const shown = 5;

console.log(total - shown);
```
```output
-2
```

「残りの数だけ枠を作る」ような計算で、**表示済みが総数を超える**と負になります。

`Math.max(0, ...)` で床を作ってください。

```js run
const total = 3;
const shown = 5;

console.log(new Array(Math.max(0, total - shown)).length);
```
```output
0
```

## 原因3: `length` に代入した

```js run
const list = [1, 2, 3];

try {
  list.length = -1;
} catch (error) {
  console.log(error.name + ': ' + error.message);
}

list.length = 1;

console.log(list);
```
```output
RangeError: Invalid array length
[ 1 ]
```

`length` への代入は[key:切り詰め]として働きます。**負の数は入れられません。**

空にしたいなら `list.length = 0` です。
[dim:ただし、同じ配列を指している変数がすべて影響を受けます。新しい配列を作るほうが安全なことも多くあります。]

## `new Array(3)` と `Array.of(3)` は別物

**ここも取り違えやすいところです。**

```js run
console.log(new Array(3));
console.log(new Array(3).length);
console.log(Array.of(3));
console.log(new Array(3, 4));
```
```output
[ <3 empty items> ]
3
[ 3 ]
[ 3, 4 ]
```

- 数を[num:1]つだけ渡す → **長さの指定**
- [num:2]つ以上渡す → **要素として並ぶ**
- `Array.of()` → **いつでも要素**

`new Array(3)` が作るのは[type:穴]が3つ並んだ配列です。
`map()` を通しても[bad:何も起きません]。

```js run
console.log(new Array(3).map((_, i) => i));
console.log(Array.from({ length: 3 }, (_, i) => i));
console.log(new Array(3).fill(0));
```
```output
[ <3 empty items> ]
[ 0, 1, 2 ]
[ 0, 0, 0 ]
```

**連番を作るなら `Array.from()`、同じ値で埋めるなら `fill()`** です。
→ [配列の基本](/ja/javascript/learn/array/basics/)

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

| 文言 | 意味 |
|---|---|
| `Invalid array length` | **長さになれない数**を渡した |
| `Cannot read properties of undefined` | 範囲の外を読んだあとの中身 |
| `x is not a function` | `Array` を関数でないものと取り違えた |
| `Maximum call stack size exceeded` | 再帰が止まらない |

[dim:このページの実行結果は Node 22.22.3 のものです。文言は処理系と版によって変わります。]

## 探しかたの順序

1. **`new Array()` か `length =` に渡している値を、そのまま出す**
2. `NaN` なら → 数値変換まで遡る（`Number()` / `parseInt()` / 割り算）
3. 負の数なら → 引き算に `Math.max(0, ...)` を入れる
4. 小数なら → `Math.ceil()` / `Math.floor()` で整数にする

## まとめ

- 長さは[num:0]以上・2の32乗未満の**整数**だけ
- **いちばん多い原因は `NaN`。** 数値変換の失敗が伝わってきている
- 引き算で負になる経路には `Math.max(0, ...)`
- `length` への代入は切り詰め。負の数は入れられない
- **`new Array(3)` は穴3つ、`Array.of(3)` は要素1つ**
- 連番は `Array.from()`、埋めるなら `fill()`
