【JavaScript】配列の使い方まとめ|作成・追加・削除・ループ・スプレッド構文・分割代入・破壊的 / 非破壊的メソッドまで解説

JavaScript の配列(Array)は、複数の値をまとめて管理するための基本的なデータ構造です。要素の追加・削除、ループ処理、検索・フィルタリング、ソートなど、あらゆる場面で使います。この記事では配列の作成から主要メソッドの全体像までを体系的にまとめます。

この記事でわかること
・配列の作成方法(リテラル・Array.from・Array.of)
・要素へのアクセスと at() メソッド
・要素の追加(push / unshift / splice)と削除(pop / shift / splice)
・ループ処理(for / forEach / for…of / map)
・スプレッド構文によるコピー・結合・展開
・分割代入で要素を変数に取り出す方法
・破壊的メソッドと非破壊的メソッドの分類
・配列メソッド早見表
スポンサーリンク

配列の作成方法

配列リテラル(最も一般的)
const fruits = ["りんご", "みかん", "ぶどう"];
const numbers = [1, 2, 3, 4, 5];
const mixed = [1, "hello", true, null]; // 異なる型も格納可能
const empty = []; // 空の配列
Array.from(配列風オブジェクトから変換)
// NodeList → 配列
const divs = Array.from(document.querySelectorAll("div"));

// 文字列 → 1文字ずつの配列
const chars = Array.from("Hello"); // ["H", "e", "l", "l", "o"]

// 連番の配列を生成
const range = Array.from({ length: 5 }, (_, i) => i + 1);
// [1, 2, 3, 4, 5]
Array.of(引数をそのまま要素に)
// new Array(5) は「長さ5の空配列」を作ってしまう
console.log(new Array(5));   // [空×5]

// Array.of(5) は「要素が5の配列」を作る
console.log(Array.of(5));    // [5]
console.log(Array.of(1, 2, 3)); // [1, 2, 3]

要素へのアクセス

JavaScript
const arr = [10, 20, 30, 40, 50];

// ブラケット記法(0始まり)
console.log(arr[0]);  // 10(先頭)
console.log(arr[4]);  // 50(末尾)
console.log(arr[10]); // undefined(範囲外)

// at() メソッド(負のインデックス対応・ES2022)
console.log(arr.at(0));  // 10
console.log(arr.at(-1)); // 50(末尾)
console.log(arr.at(-2)); // 40(末尾から2番目)
末尾の要素を取得するなら arr.at(-1)arr[arr.length - 1] よりも簡潔です。

要素の追加と削除

メソッド 位置 動作 戻り値
push(el) 末尾 追加 新しい length
pop() 末尾 削除 削除した要素
unshift(el) 先頭 追加 新しい length
shift() 先頭 削除 削除した要素
splice(i, n, ...el) 任意 削除+追加 削除した要素の配列
JavaScript
const arr = [1, 2, 3];

arr.push(4);       // [1, 2, 3, 4](末尾に追加)
arr.pop();         // [1, 2, 3](末尾を削除)
arr.unshift(0);    // [0, 1, 2, 3](先頭に追加)
arr.shift();       // [1, 2, 3](先頭を削除)

// splice: インデックス1から1個削除し、10を挿入
arr.splice(1, 1, 10); // [1, 10, 3]
これらのメソッドはすべて破壊的(元の配列を変更)です。React の state 更新など元の配列を変更したくない場合は、スプレッド構文や非破壊メソッド(後述)を使ってください。

配列のループ処理

方法 特徴 推奨場面
for ループ インデックスを使える、break / continue 可能 インデックスが必要、途中終了したい場合
for...of 値を直接取得、break 可能 値だけ必要、途中終了したい場合
forEach コールバック形式、break 不可 全要素を処理する場合
map 新しい配列を返す 変換して新しい配列を作る場合
JavaScript
const fruits = ["りんご", "みかん", "ぶどう"];

// for ループ
for (let i = 0; i < fruits.length; i++) {
  console.log(i, fruits[i]);
}

// for...of(値だけ取得)
for (const fruit of fruits) {
  console.log(fruit);
}

// forEach(コールバック)
fruits.forEach((fruit, index) => {
  console.log(index, fruit);
});

// map(新しい配列を生成)
const upper = fruits.map(f => f + "ジュース");
console.log(upper); // ["りんごジュース", "みかんジュース", "ぶどうジュース"]

スプレッド構文(…)でコピー・結合・展開

配列のコピー
const original = [1, 2, 3];
const copy = [...original];

copy.push(4);
console.log(original); // [1, 2, 3](元は変わらない)
console.log(copy);     // [1, 2, 3, 4]
配列の結合
const a = [1, 2];
const b = [3, 4];
const merged = [...a, ...b]; // [1, 2, 3, 4]

// 途中に要素を挟むことも可能
const withMiddle = [...a, 99, ...b]; // [1, 2, 99, 3, 4]
関数の引数に展開
const scores = [85, 92, 78, 96, 88];
console.log(Math.max(...scores)); // 96
console.log(Math.min(...scores)); // 78
スプレッド構文はシャローコピーです。配列の要素がオブジェクトの場合、オブジェクト自体は参照を共有します。ディープコピーには structuredClone(arr) を使います。

分割代入で要素を変数に取り出す

JavaScript
const rgb = [255, 128, 0];

// 各要素を変数に取り出す
const [red, green, blue] = rgb;
console.log(red, green, blue); // 255, 128, 0

// 一部をスキップ
const [first, , third] = [10, 20, 30];
console.log(first, third); // 10, 30

// 残りをまとめて取得(レスト構文)
const [head, ...rest] = [1, 2, 3, 4, 5];
console.log(head); // 1
console.log(rest); // [2, 3, 4, 5]

// デフォルト値
const [a = 0, b = 0, c = 0] = [10];
console.log(a, b, c); // 10, 0, 0
変数の入れ替え(swap)
let x = 1;
let y = 2;
[x, y] = [y, x];
console.log(x, y); // 2, 1

破壊的メソッドと非破壊的メソッドの分類

JavaScript の配列メソッドには、元の配列を変更するもの(破壊的)新しい配列を返すもの(非破壊的)があります。React やイミュータブルな設計では非破壊的メソッドが推奨されます。

破壊的(元を変更する) 非破壊的(新しい配列を返す)
push / pop / shift / unshift concat / slice
splice toSpliced(ES2023)
sort toSorted(ES2023)
reverse toReversed(ES2023)
fill with(ES2023)
ES2023 の非破壊メソッド
const arr = [3, 1, 2];

// toSorted: 元の配列を変更せずにソート
const sorted = arr.toSorted((a, b) => a - b);
console.log(sorted); // [1, 2, 3]
console.log(arr);    // [3, 1, 2](元のまま)

// toReversed: 元の配列を変更せずに反転
const reversed = arr.toReversed();
console.log(reversed); // [2, 1, 3]

// with: 指定インデックスの値を変更した新しい配列
const updated = arr.with(1, 99);
console.log(updated); // [3, 99, 2]
ES2023 の toSorted / toReversed / toSpliced / with は元の配列を変更しないため、React の state 更新に最適です。

sort の注意点

数値ソートの落とし穴
const nums = [10, 2, 30, 4];

// NG: デフォルトは文字列比較
console.log(nums.sort()); // [10, 2, 30, 4](文字列として比較)

// OK: 比較関数を渡す
console.log(nums.sort((a, b) => a - b)); // [2, 4, 10, 30](昇順)
console.log(nums.sort((a, b) => b - a)); // [30, 10, 4, 2](降順)
sort() のデフォルトは文字列として比較するため、数値のソートでは必ず比較関数 (a, b) => a - b を渡してください。

配列メソッド早見表

カテゴリ メソッド 概要
追加・削除 push / pop / shift / unshift / splice 要素の追加・削除
検索 indexOf / includes / find / findIndex / findLast 要素の存在・位置・値を検索
変換 map / flatMap 各要素を変換して新しい配列を返す
フィルタ filter 条件に合う要素だけの配列を返す
集計 reduce / reduceRight 全要素を1つの値にまとめる
判定 every / some 全要素 or いずれかが条件を満たすか
順序 sort / reverse / toSorted / toReversed 並び替え・反転
切り出し slice / splice / toSpliced 一部を切り出す・削除
結合 concat / flat / join 配列の結合・平坦化・文字列化
生成 Array.from / Array.of / fill / keys / values / entries 配列の生成・イテレータ

関連記事

よくある質問

Q配列のコピーはどう行いますか?
Aスプレッド構文 [...arr] でシャローコピーできます。要素にオブジェクトが含まれる場合はオブジェクト自体は共有されるため、ディープコピーが必要なら structuredClone(arr) を使ってください。
Qsort() で数値が正しくソートされません。
Asort() のデフォルトは文字列として比較するため、[10, 2, 30].sort()[10, 2, 30] になります。数値のソートには比較関数 .sort((a, b) => a - b) を必ず渡してください。
Q破壊的メソッドと非破壊的メソッドの見分け方は?
A残念ながら名前だけでは判断できません。ES2023 で追加された toSorted / toReversed / toSpliced / with は非破壊版として設計されています。判断に迷ったら MDN のドキュメントで「元の配列を変更する」かどうかを確認してください。
QforEach と map の違いは何ですか?
AforEach は戻り値がなく(undefined)、副作用(console.log など)のために使います。map は各要素を変換した新しい配列を返すため、変換処理に使います。
Q配列かどうかを判定するには?
AArray.isArray(value) を使います。typeof では配列は "object" と判定されるため区別できません。

まとめ

JavaScript の配列の使い方を体系的に整理しました。

  • 作成: 配列リテラル [] が基本、Array.from で変換、Array.of で要素指定
  • アクセス: arr[i]、末尾は arr.at(-1)
  • 追加・削除: push / pop / unshift / shift / splice
  • ループ: for…of(値だけ)/ forEach(コールバック)/ map(変換)
  • スプレッド構文: コピー・結合・関数引数への展開
  • 分割代入: 要素を変数に取り出す、レスト構文、swap
  • 破壊的 vs 非破壊: ES2023 の toSorted / toReversed / with が非破壊版

配列は JavaScript の中核となるデータ構造です。メソッド早見表を手元に置いて、map / filter / reduce などの詳細は関連記事で掘り下げてください。