【JavaScript】slice の使い方|配列・文字列の切り出し・負のインデックス・splice / substring との違いまで解説

【JavaScript】slice の使い方|配列・文字列の切り出し・負のインデックス・splice / substring との違いまで解説 JavaScript

slice は配列や文字列の一部を切り出して新しい配列・文字列を返すメソッドです。元のデータを変更しない「非破壊的」な操作であるため、安全にデータの一部を取り出せます。ページネーション、テキストの省略表示、配列のコピーなど、実務で使う場面が非常に多いメソッドです。

この記事でわかること
・配列の slice の基本構文と動作
・文字列の slice の基本構文と動作
・負のインデックスで末尾から切り出す方法
・引数省略パターン(コピー・末尾まで)
・splice との違い(非破壊 vs 破壊)
・substring との違い(負の値の扱い)
・ページネーション・テキスト省略・チャンク分割の実務パターン
スポンサーリンク

配列の slice の基本

構文
const newArray = array.slice(start, end);
// start: 開始インデックス(この位置を含む)
// end:   終了インデックス(この位置は含まない)
// 戻り値: 切り出した新しい配列(元の配列は変更されない)
基本例
const fruits = ["りんご", "みかん", "ぶどう", "いちご", "メロン"];

console.log(fruits.slice(1, 4));  // ["みかん", "ぶどう", "いちご"]
console.log(fruits.slice(2));     // ["ぶどう", "いちご", "メロン"](末尾まで)
console.log(fruits.slice(0, 2));  // ["りんご", "みかん"]

// 元の配列は変更されない
console.log(fruits); // ["りんご", "みかん", "ぶどう", "いちご", "メロン"]

end の位置の要素は含まれませんslice(1, 4) ならインデックス 1・2・3 の 3 要素が返ります。

引数の省略パターン

呼び出し方 動作 用途
slice() 全要素のコピー 配列のシャローコピー
slice(n) インデックス n から末尾まで 先頭 n 要素を除去
slice(0, n) 先頭から n 要素 先頭 n 要素を取得
slice(n, m) インデックス n から m-1 まで 範囲指定で切り出し

配列のシャローコピー

引数なしの slice() は配列全体のコピーを作成します。スプレッド構文 [...arr] と同じ効果です。

JavaScript
const original = [1, 2, 3];
const copy = original.slice();

copy.push(4);
console.log(original); // [1, 2, 3](元の配列は変更されない)
console.log(copy);     // [1, 2, 3, 4]
slice のコピーはシャローコピー(浅いコピー)です。配列の要素がオブジェクトの場合、オブジェクト自体は共有されます。ネストされたオブジェクトまでコピーしたい場合は structuredClone(arr) を使ってください。

文字列の slice の基本

文字列にも同じ構文の slice が使えます。指定した範囲の部分文字列を返します。

JavaScript
const str = "JavaScript";

console.log(str.slice(0, 4));  // "Java"
console.log(str.slice(4));     // "Script"
console.log(str.slice(4, 10)); // "Script"

// 元の文字列は変更されない
console.log(str); // "JavaScript"
ファイル名から拡張子を取得
const filename = "report-2026.pdf";
const ext = filename.slice(filename.lastIndexOf("."));
console.log(ext); // ".pdf"

// 拡張子を除いたファイル名
const name = filename.slice(0, filename.lastIndexOf("."));
console.log(name); // "report-2026"

負のインデックスで末尾から切り出す

slice に負の値を渡すと、末尾からの位置として解釈されます。-1 は最後の要素、-2 は最後から 2 番目です。

配列の例
const arr = [10, 20, 30, 40, 50];

console.log(arr.slice(-2));     // [40, 50](末尾2要素)
console.log(arr.slice(-3, -1)); // [30, 40](末尾3番目〜末尾2番目)
console.log(arr.slice(-1));     // [50](最後の1要素)
文字列の例
const path = "/home/user/documents/file.txt";

// 末尾4文字を取得
console.log(path.slice(-4)); // ".txt"

// 末尾4文字を除いた部分
console.log(path.slice(0, -4)); // "/home/user/documents/file"

インデックスの対応関係

配列 ["A", "B", "C", "D", "E"] の場合:

正のインデックス 0 1 2 3 4
負のインデックス -5 -4 -3 -2 -1
要素 A B C D E
末尾から N 要素を取得するパターン arr.slice(-N) は非常に頻出します。最新 N 件のログ取得やページネーションの最終ページなどに活用できます。

slice と splice の違い

名前が似ているため混同しやすいですが、動作はまったく異なります。

比較項目 slice splice
元の配列 変更しない(非破壊的) 変更する(破壊的)
戻り値 切り出した新しい配列 削除された要素の配列
要素の追加 できない 第3引数以降で追加可能
引数 (start, end) (start, deleteCount, ...items)
文字列 使える 使えない(配列専用)
slice(非破壊的)
const arr = [1, 2, 3, 4, 5];
const result = arr.slice(1, 3);

console.log(result); // [2, 3]
console.log(arr);    // [1, 2, 3, 4, 5](元のまま)
splice(破壊的)
const arr = [1, 2, 3, 4, 5];
const removed = arr.splice(1, 2); // インデックス1から2要素を削除

console.log(removed); // [2, 3](削除された要素)
console.log(arr);     // [1, 4, 5](元の配列が変更された)
splice は元の配列を変更するため、React の state 更新や関数型プログラミングでは使用を避けるのが一般的です。元の配列を壊さない slice が推奨されます。

文字列の slice と substring の違い

文字列を切り出すメソッドには slicesubstring の 2 つがあります。基本的な動作は同じですが、負の値の扱いが異なります。

比較項目 slice substring
負のインデックス 末尾からの位置として扱う 0 として扱う
start > end の場合 空文字を返す 自動的に入れ替える
配列 使える 使えない(文字列専用)
負の値の扱いの違い
const str = "JavaScript";

// slice: 負の値 → 末尾からの位置
console.log(str.slice(-6));    // "Script"

// substring: 負の値 → 0として扱われる
console.log(str.substring(-6)); // "JavaScript"(= substring(0))
start > end の場合の違い
const str = "Hello";

// slice: start > end → 空文字
console.log(str.slice(3, 1));     // ""

// substring: start > end → 自動入れ替え(= substring(1, 3))
console.log(str.substring(3, 1)); // "el"
迷ったら slice を使ってください。負のインデックスが使えて挙動が直感的です。substring は引数の自動入れ替えなど予想しにくい動作があるため、slice に統一する方がコードの可読性が上がります。

実務でよく使うパターン

ページネーション(配列をページ単位で分割)

JavaScript
function getPage(items, page, perPage) {
  const start = (page - 1) * perPage;
  return items.slice(start, start + perPage);
}

const allItems = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

console.log(getPage(allItems, 1, 3)); // [1, 2, 3](1ページ目)
console.log(getPage(allItems, 2, 3)); // [4, 5, 6](2ページ目)
console.log(getPage(allItems, 4, 3)); // [10](最終ページ)

テキストの省略表示(truncate)

JavaScript
function truncate(str, maxLength) {
  if (str.length <= maxLength) return str;
  return str.slice(0, maxLength) + "...";
}

console.log(truncate("JavaScriptのsliceメソッド徹底解説", 15));
// "JavaScriptのsli..."

サロゲートペア(絵文字)に対応した切り出し

絵文字などのサロゲートペア文字は 1 文字が内部的に 2 つの char で構成されるため、String.prototype.slice で途中で切ると文字化けします。

JavaScript
const text = "Hello?World";

// String.slice: サロゲートペアの途中で切れる可能性
console.log(text.slice(0, 6)); // "Hello\ud83c"(文字化け)

// スプレッド構文で文字単位の配列に変換してから slice
const chars = [...text];
console.log(chars.slice(0, 6).join("")); // "Hello?"(正しい)

配列をチャンク(固定サイズ)に分割する

JavaScript
function chunk(array, size) {
  const result = [];
  for (let i = 0; i < array.length; i += size) {
    result.push(array.slice(i, i + size));
  }
  return result;
}

console.log(chunk([1, 2, 3, 4, 5, 6, 7], 3));
// [[1, 2, 3], [4, 5, 6], [7]]

先頭・末尾の要素を除去した新しい配列

JavaScript
const arr = [1, 2, 3, 4, 5];

// 先頭1要素を除去
console.log(arr.slice(1));     // [2, 3, 4, 5]

// 末尾1要素を除去
console.log(arr.slice(0, -1)); // [1, 2, 3, 4]

// 先頭と末尾の両方を除去
console.log(arr.slice(1, -1)); // [2, 3, 4]

関連記事

よくある質問

Qslice に範囲外のインデックスを指定するとエラーになりますか?
Aエラーにはなりません。範囲外の値は自動的に配列・文字列の長さに丸められます。例えば [1, 2, 3].slice(0, 100)[1, 2, 3] を返し、slice(5) は空配列 [] を返します。
Qslice と splice はどちらを使うべきですか?
A原則として slice(非破壊的)を優先してください。React の state 更新や関数型プログラミングでは元の配列を変更しないことが重要です。元の配列を直接編集する必要がある場合にのみ splice を使いましょう。
Q文字列を切り出すなら slice と substring どちらがよいですか?
Aslice を推奨します。負のインデックスで末尾から切り出せる点、start > end のときに空文字を返す直感的な挙動の点で優れています。substring は引数の自動入れ替えなど予想しにくい動作があるため、slice に統一する方がバグを防げます。
Qslice で配列のディープコピーはできますか?
Aできません。slice() はシャローコピー(浅いコピー)です。配列の要素がオブジェクトの場合、参照が共有されます。ディープコピーが必要なら structuredClone(arr)(モダンブラウザ対応)を使ってください。
Q絵文字を含む文字列で slice すると文字化けします。
A絵文字(サロゲートペア)は内部的に 2 つの char で構成されるため、String.prototype.slice で途中で切れることがあります。[...str].slice(0, n).join("") のように、スプレッド構文で文字単位の配列に変換してから slice すると正しく切り出せます。

まとめ

slice は配列と文字列の両方で使える、非破壊的に一部を切り出すメソッドです。

  • 基本: slice(start, end) で start を含み end を含まない範囲を返す
  • 負のインデックス: slice(-N) で末尾から N 要素を取得
  • コピー: slice() で配列のシャローコピー
  • splice との違い: slice は非破壊、splice は破壊的
  • substring との違い: slice は負の値を末尾からの位置として扱う

ページネーション、テキスト省略、チャンク分割など実務で使う場面が多いため、挙動をしっかり理解しておきましょう。