Array.from() — 何からでも配列にする
第2引数に関数を渡すと、その場で加工できます。
Array.from(x).map(f) と同じですが、中間の配列を作りません。
対象は反復可能なもの、または length を持つものです。
→ 反復可能とイテレータ
const holed = new Array(3);
console.log(holed);
console.log(holed.length);
console.log(holed.map((value, i) => i));length が無いものは黙って空配列になります。エラーにはなりません。
new Array(3) は「穴」を作る
ここが最大の落とし穴です。
console.log(new Array(3));
console.log(new Array(1, 2, 3));length は3なのに、map() が1度も呼ばれません。
undefined が3つ入っているのではなく、要素が存在しない状態です。
map() / forEach() / filter() は、この穴を飛ばします。
Array.from() なら、ちゃんと undefined が入ります。
fill() で埋めても直ります。
const grid = new Array(2).fill([]);
grid[0].push('x');
console.log(JSON.stringify(grid));引数が1つか2つかで意味が変わる
数値を1つ渡したときだけ「長さ」の意味になります。
これを避けるために Array.of() があります。
try {
console.log([...{ length: 3 }]);
} catch (error) {
console.log(error.name + ': ' + error.message);
}Array.of() は必ず要素として扱います。
長さに使えない値を渡すと落ちます。
→ RangeError: Invalid array length
fill() で同じものを共有してしまう
片方に足したのに、両方に入りました。
fill() は同じ1つのものを全部に置くからです。
毎回作りたいなら Array.from() の第2引数です。
オブジェクトや配列を fill() に渡さないでください。 数値や文字列なら問題ありません。
連番を作る
これがいちばん短い書き方です。
for で push() しても同じですが、行数が増えます。
スプレッドとの使い分け
反復可能なものなら、[...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]が短い