配列を作る — Array.from() / Array.of() / new Array()

new Array(3) が作るのは「穴が3つ」で、map() が動きません。Array.from() との違い、 fill() で同じオブジェクトが共有される罠、連番の作り方まで実行して確かめます。

実行して検証済み処理系Node 22.22.3対応ES2015難易度●●○○○目安8更新

Array.from() — 何からでも配列にする

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 'あ', 'い' ] [ 1, 2 ] [ 10, 20 ]
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ undefined, undefined, undefined ] [ 0, 2, 4 ] []

第2引数に関数を渡すと、その場で加工できます。 Array.from(x).map(f) と同じですが、中間の配列を作りません。

対象は反復可能なもの、または length を持つものです。 → 反復可能とイテレータ

javascript
const holed = new Array(3);

console.log(holed);
console.log(holed.length);
console.log(holed.map((value, i) => i));
[ <3 empty items> ] 3 [ <3 empty items> ]
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ undefined, undefined, undefined ] [ 0, 1, 2 ]

length が無いものは黙って空配列になります。エラーにはなりません。

new Array(3) は「穴」を作る

ここが最大の落とし穴です。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 0, 1, 2 ]
javascript
console.log(new Array(3));
console.log(new Array(1, 2, 3));
[ <3 empty items> ] [ 1, 2, 3 ]

length は3なのに、map() が1度も呼ばれません。

undefined が3つ入っているのではなく、要素が存在しない状態です。 map() / forEach() / filter() は、この穴を飛ばします。

Array.from() なら、ちゃんと undefined が入ります。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 3 ] [ 1, 2, 3 ]
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
RangeError: Invalid array length

fill() で埋めても直ります。

javascript
const grid = new Array(2).fill([]);

grid[0].push('x');

console.log(JSON.stringify(grid));
[["x"],["x"]]
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[["x"],[]]

引数が1つか2つかで意味が変わる

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 0, 1, 2, 3, 4 ] [ 1, 2, 3, 4, 5 ] [ 0, 10, 20 ]
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 'あ', 'い' ] [ 1, 2 ]

数値を1つ渡したときだけ「長さ」の意味になります。 これを避けるために Array.of() があります。

javascript
try {
console.log([...{ length: 3 }]);
} catch (error) {
console.log(error.name + ': ' + error.message);
}
TypeError: {(intermediate value)} is not iterable

Array.of()必ず要素として扱います

長さに使えない値を渡すと落ちます。

RangeError: Invalid array length

fill() で同じものを共有してしまう

片方に足したのに、両方に入りました。 fill()同じ1つのものを全部に置くからです。

毎回作りたいなら Array.from() の第2引数です。

オブジェクトや配列を fill() に渡さないでください。 数値や文字列なら問題ありません。

連番を作る

これがいちばん短い書き方です。 forpush() しても同じですが、行数が増えます。

スプレッドとの使い分け

反復可能なものなら、[...x] のほうが短く書けます。

使うもの 何ができるか
[...x] 反復可能なものだけ。いちばん短い
Array.from(x) length だけのものも扱える。加工の関数を渡せる
Array.of(a, b) 渡した値をそのまま要素にする
new Array(n) 長さだけ決める。中身は穴

{ length: 3 } のような形は反復可能ではないので、 スプレッドでは開けません。

スプレッド構文と残余

まとめ

  • Array.from()反復可能なものと length を持つものから作る。第2引数で加工できる
  • new Array(3) が作るのは穴。 map()forEach() も飛ばす
  • 数値1つを渡したときだけ「長さ」になる。避けたいなら Array.of()
  • fill() にオブジェクトや配列を渡すと、全部が同じものを指す
  • 連番は Array.from({ length: n }, (unused, i) => i)
  • 反復可能なだけなら [...x] が短い

この記事の根拠

  1. Array.from — ECMAScript® 2026 Language Specificationtc39.es
  2. Array.of — ECMAScript® 2026 Language Specificationtc39.es
  3. Array.from() — MDNdeveloper.mozilla.org

掲載しているコード例は、公開前に読み手が押したときに動くのと同じもので実行して出力を突き合わせています。結果はリポジトリに残しています。

このページの原文(Markdown)