Skip to main content

JavaScript Array Methods

This guide groups array methods by behavior, clarifies mutating vs non‑mutating operations, and calls out common pitfalls and best practices. Examples are MDX‑safe.

Tip: For Array properties (length, prototype, Symbol.iterator, toString/join, etc.) with examples, see the companion page: array-properties.md. A quick "Properties" recap appears near the end.

Quick Scan Reference (with version badges)

Each API shows an inline badge for when it landed in ECMAScript.

  • Legacy (pre‑ES5): concat, join, pop, push, reverse, shift, slice, sort, splice, unshift
  • ES5 (2009): Array.isArray, forEach, map, filter, reduce, reduceRight, every, some, indexOf, lastIndexOf
  • ES2015/ES6: Array.from, Array.of, entries, keys, values, copyWithin, fill, find, findIndex
  • ES2016: includes
  • ES2019: flat, flatMap
  • ES2022: at
  • ES2023: toSorted, toReversed, toSpliced, with, findLast, findLastIndex

Mutating vs Non‑mutating cheat sheet

  • Mutating: push, pop, shift, unshift, splice, sort, reverse, fill, copyWithin.

  • Non‑mutating: concat, slice, map, filter, reduce, reduceRight, find, findIndex, findLast, findLastIndex, includes, indexOf, lastIndexOf, flat, flatMap, every, some, join, at, toSorted, toReversed, toSpliced, with, entries, keys, values, forEach (doesn’t change array, but can cause side effects).

  • Static: Array.of, Array.from, Array.isArray


Construction and Type

Array.from Added in ES2015

// (iterable/mapFn?) => Array
Array.from({ length: 3 }, (_, i) => i); // [0,1,2]

Array.of Added in ES2015



Array.of(1); // [1]
Array.of(1, 2, 3); // [1,2,3]

Array.isArray Added in ES5

Array.isArray([]); // true
Array.isArray(new Uint8Array()); // false (typed arrays are not regular Arrays)

Notes:

  • Copies are shallow; nested arrays/objects share references. Use structuredClone or libraries for deep cloning when needed.

  • Array.from and spread convert holes into undefined; methods like map/forEach skip holes.


Adding / Removing items

push Legacy · pop Legacy

const arr = [1, 2, 3];
arr.push(4); // [1,2,3,4]
arr.pop(); // [1,2,3]

unshift Legacy · shift Legacy

const a = [1, 2, 3];
a.unshift(0); // [0,1,2,3]
a.shift(); // [1,2,3]

splice Legacy

const xs = [0, 1, 2, 3];
xs.splice(2, 0, 'x'); // insert at idx 2 -> [0,1,'x',2,3]
xs.splice(1, 2); // remove 2 starting at 1 -> [0,3]

toSpliced Added in ES2023

const base = [0, 1, 2, 3];
const inserted = base.toSpliced(2, 0, 'x'); // [0,1,'x',2,3] (base unchanged)
const removed = base.toSpliced(1, 2); // [0,3] (base unchanged)

Access and updates

at Added in ES2022


const letters = ['x', 'y', 'z'];
letters.at(0); // 'x'
letters.at(-1); // 'z' (from end)

with Added in ES2023

const arr = ['x', 'y', 'z'];
const arr2 = arr.with(1, 'Y'); // ['x','Y','z'] (arr unchanged)

Searching and testing

indexOf Added in ES5 · lastIndexOf Added in ES5

const fruits = ['apple', 'banana', 'orange', 'banana'];
fruits.indexOf('banana'); // 1
fruits.lastIndexOf('banana'); // 3

includes Added in ES2016

[NaN].includes(NaN); // true (indexOf would return -1)

find Added in ES2015 · findIndex Added in ES2015


const numbers = [1, 2, 3, 4];
numbers.find(n => n > 2); // 3
numbers.findIndex(n => n > 2); // 2

findLast Added in ES2023 · findLastIndex Added in ES2023

const ns = [1, 2, 3, 4];
ns.findLast(n => n > 2); // 4
ns.findLastIndex(n => n > 2); // 3

every Added in ES5 · some Added in ES5

[1,2,3].every(n => n > 0); // true
[1,2,3].some(n => n > 2); // true

Transforming

map Added in ES5

[1,2,3].map(n => n * 2); // [2,4,6]

filter Added in ES5


[1,2,3,4,5].filter(n => n % 2 === 0); // [2,4]

reduce Added in ES5 · reduceRight Added in ES5

[1,2,3,4,5].reduce((sum, n) => sum + n, 0); // 15
[1,2,3,4,5].reduceRight((sum, n) => sum + n, 0); // 15

flat Added in ES2019 · flatMap Added in ES2019


[1, [2, [3, 4]]].flat(Infinity); // [1,2,3,4]
[{t:['a','b']},{t:['c']}].flatMap(x => x.t); // ['a','b','c']

Copying and immutability helpers

slice Legacy

const a = [0,1,2,3];
a.slice(1, 3); // [1,2]

concat Legacy

[1,2].concat([3,4]); // [1,2,3,4]

toSorted Added in ES2023

const nums = [10, 2, 1];
const sorted = nums.toSorted((a, b) => a - b); // [1,2,10]; nums unchanged

sort Legacy

const ns = [10, 2, 1];
ns.sort((a, b) => a - b); // [1,2,10]; ns mutated
['ä', 'a'].sort((a, b) => a.localeCompare(b, 'de')); // locale‑aware

toReversed Added in ES2023 · reverse Legacy

const letters = ['a', 'b', 'c'];
letters.toReversed(); // ['c','b','a'] (non‑mutating)
letters.reverse(); // ['c','b','a'] (mutates)

toSpliced Added in ES2023 · splice Legacy

const base = [0,1,2,3];
base.toSpliced(1, 2); // [0,3] (non‑mutating)
base.splice(1, 2); // [0,3] (mutates base)

with Added in ES2023

const arr = [0,1,2];
arr.with(2, 99); // [0,1,99] (non‑mutating)

Filling and in‑place copying

fill Added in ES2015

new Array(5).fill(0); // [0,0,0,0,0]
['a','b','c','d'].fill('x', 1, 3); // ['a','x','x','d']

copyWithin Added in ES2015

// copyWithin(target, start, end?) -> mutates
[1,2,3,4,5].copyWithin(0, 3); // [4,5,3,4,5]

Iteration helpers

forEach Added in ES5

const log = [];
[1,2,3].forEach(n => log.push(n * 2));
// log: [2,4,6]

entries Added in ES2015 · keys Added in ES2015 · values Added in ES2015

const a = ['x','y'];
for (const [i, v] of a.entries()) { /* index + value */ }
for (const i of a.keys()) { /* indices */ }
for (const v of a.values()) { /* values */ }

String/locale conversions

join Legacy



[1,2,3].join('-'); // '1-2-3'

toString Legacy · toLocaleString Legacy

[1, 2, 3].toString(); // '1,2,3'
[1234.5].toLocaleString('de-DE'); // '1.234,5'

Notes on stability and comparators

  • Modern engines implement stable sorting; toSorted also preserves stability.
  • Always provide a comparator for numbers or objects.

Sparse Arrays and Holes

  • map/filter/forEach skip holes.
  • Array.from and spread convert holes to undefined.
  • at, direct indexing, and length include holes; be mindful when counting.

Properties quick recap (examples)

These are properties rather than methods; see array-properties.md for deeper coverage.

length Legacy

const arr = [1,2,3];
arr.length; // 3
arr.length = 1; // truncate -> [1]

Symbol.iterator Added in ES2015

for (const v of ['a','b']) { /* iterates values */ }

Big‑O Hints

  • push/pop: O(1)
  • shift/unshift: O(n)
  • splice (insert/remove in middle): O(n)
  • includes/indexOf: O(n)
  • Random access arr[i]: O(1)
  • sort: typically O(n log n)

Good Practices

  • Prefer non‑mutating methods when managing UI state or shared data.