Back to blog

JavaScript Array slice vs splice: Understanding Mutability and Arguments

JavaScript provides a rich collection of built-in array methods. Among them, slice() and splice() are two of the most frequently used, yet they are easily confused due to their similar names.

The difference between these methods is not just syntax; it defines whether you copy data safely or mutate your application's state directly.

In this guide, we will compare slice() and splice(), analyze their arguments, and explore why choosing the correct method is critical for state management frameworks like React.

1. The Core Difference: Mutability

The primary distinction between the two methods is mutability:

  • slice() is Immutable (Non-destructive): It extracts a portion of an array and returns it as a new array. The original array remains completely unchanged.
  • splice() is Mutable (Destructive): It modifies the original array directly by adding, removing, or replacing elements. It has side effects.

2. slice() Syntax and Behavior

The slice() method is used to copy a subset of an array.

Syntax

array.slice(start, end)

  • start (Optional): The zero-based index at which to begin extraction. If omitted, it defaults to 0.
  • end (Optional): The zero-based index before which to end extraction. slice extracts up to, but does not include, the element at the end index.
const fruits = ['Apple', 'Banana', 'Orange', 'Mango', 'Kiwi'];

// Copy elements from index 1 up to (but not including) index 4
const subArray = fruits.slice(1, 4);

console.log(subArray); // Outputs: ['Banana', 'Orange', 'Mango']
console.log(fruits);   // Outputs: ['Apple', 'Banana', 'Orange', 'Mango', 'Kiwi'] (Unchanged)

You can also use slice() with no arguments to create a shallow clone of an entire array:

const clone = fruits.slice();

3. splice() Syntax and Behavior

The splice() method is used to modify the contents of an array.

Syntax

array.splice(start, deleteCount, item1, item2, ...)

  • start: The index at which to start changing the array.
  • deleteCount: The number of elements to remove from the start index.
  • item1, item2, ... (Optional): The elements you want to insert into the array at the start index.

Splice Return Value

splice() returns an array containing the removed elements. If no elements were deleted, it returns an empty array.

const colors = ['Red', 'Green', 'Blue', 'Yellow'];

// Remove 2 elements starting at index 1, and insert 'Purple' in their place
const removed = colors.splice(1, 2, 'Purple');

console.log(colors);  // Outputs: ['Red', 'Purple', 'Yellow'] (Mutated!)
console.log(removed); // Outputs: ['Green', 'Blue'] (The deleted items)

Side-by-Side Comparison

Feature slice() splice()
Mutates original array? No Yes
Arguments (start, end) (start, deleteCount, itemsToInsert...)
End boundary Up to but excluding end index Excluded (uses delete count instead)
Return Value A new array containing copied items An array containing deleted items
Purpose Non-destructive extraction or cloning Destructive deletions, insertions, or replacements

React State Management Implications

In modern component architectures (like React, Vue, or Redux), state must be treated as immutable. Directly mutating state objects violates React's render trigger detection:

// AVOID: Mutating React state directly with splice
const removeTodo = (index) => {
  todos.splice(index, 1); // Mutates state in place! React may not re-render.
  setTodos(todos);
};

To update arrays safely in React, you must copy the array first or use non-destructive filter methods:

// Good: Using slice and the spread operator to create a new array
const removeTodo = (index) => {
  const updatedTodos = [...todos.slice(0, index), ...todos.slice(index + 1)];
  setTodos(updatedTodos);
};

Conclusion

Understanding the difference between JavaScript's array slice and splice methods prevents unexpected side effects. Use slice() when you want to duplicate, clone, or extract subsets of data safely, ensuring your source array remains unmodified. Limit the use of splice() to scenarios where you explicitly intend to modify an array in-place, and avoid it entirely when managing immutable application states.