References

Beginner-friendly references for web development, with live, editable examples.

The JavaScript array.toSpliced() method

Method JavaScript All modern browsers Updated
Quick answer

The toSpliced() method returns a new array with elements removed and/or inserted, leaving the original unchanged — the non-mutating version of splice(). arr.toSpliced(1, 2) returns a copy with two elements removed at index 1. Unlike splice(), it returns the new array (not the removed items).

Overview

toSpliced() is the non-mutating counterpart to splice(). It takes the same arguments — a start index, how many to delete, and any items to insert — but instead of changing the array in place and returning the removed elements, it returns a new array with the change applied and leaves the original alone.

This solves the classic splice() footgun: accidentally mutating an array other code still relies on. const updated = items.toSpliced(2, 1) gives you a copy with the item at index 2 removed, perfect for immutable state (React and friends) where you build a new array rather than mutating.

It belongs to the family of recent non-mutating array methods — alongside toSorted(), toReversed() and with() — that return copies. The key behavioral difference from splice() is the return value: splice() returns the removed elements, but toSpliced() returns the resulting array. Support is solid in current browsers; the spread-and-slice idiom is the fallback for older ones.

Syntax

const updated = array.toSpliced(start, deleteCount, ...items)

[1, 2, 3, 4].toSpliced(1, 2)        // [1, 4]  (original unchanged)
[1, 2, 3].toSpliced(1, 0, "x")      // [1, "x", 2, 3]  (insert)

Parameters

The array.toSpliced() method accepts the following parameters.

Parameter Description
start Index at which to begin changing the array. Negative counts from the end.
deleteCount Optional. How many elements to remove from start.
items Optional. Elements to insert at start.

Example

Live example
<pre id="out" style="font:15px ui-monospace,monospace"></pre>
<script>
  const items = ['a', 'b', 'c', 'd'];

  const removed = items.toSpliced(1, 2);   // remove 2 at index 1

  document.getElementById('out').textContent =
    'result:   ' + removed.join(', ') + '\n' +
    'original: ' + items.join(', '); // result: a, d / original: a, b, c, d
</script>

Best practices

  • Use toSpliced() when you need a copy with edits and must keep the original — ideal for immutable state.
  • Remember it returns the new array, whereas splice() returns the removed elements.
  • Pair it with toSorted(), toReversed() and with() for fully non-mutating edits.
  • Use the mutating splice() only when changing the array in place is intended.

Frequently asked questions

What is the difference between toSpliced() and splice()?
toSpliced() returns a new array and leaves the original unchanged, returning the result; splice() mutates the array and returns the removed elements.
How do I remove an item without mutating the array?
Use arr.toSpliced(index, 1), which returns a copy with that element removed.
How do I insert without mutating?
Pass 0 as the delete count: arr.toSpliced(index, 0, item).
Is toSpliced() supported everywhere?
In all current browsers. For older ones, use the spread/slice idiom as a fallback.