На главную

Справочники

Методы JavaScript

Методы Array, String, Object, Map, Set, Promise и Math: что возвращают, меняют ли исходник, с какой версии есть. Каждый пример выполнен настоящим движком — результат рядом.

Меняют исходник 11 из 84 методов в справочнике. Для неизменяемых данных (React, Vue, Redux) у массивов есть парные методы: toSorted, toReversed, toSpliced, with.

Показано 84 из 84 методов.

Array: меняют исходный массив

Эти методы правят массив на месте. В React и Vue это ломает сравнение состояний — используйте версии to…() или копию [...arr].

  • const a = [1, 2]; const len = a.push(3); [len, a] // → [3, [1, 2, 3]]

    push(...items) — Добавить в конец; возвращает новую длину, а не массив.

    ⚠ Меняет исходный объект.

  • const a = [1, 2, 3]; const last = a.pop(); [last, a] // → [3, [1, 2]]

    pop() — Снять последний элемент и вернуть его.

    ⚠ Меняет исходный объект.

  • const a = [2, 3]; a.unshift(1); a // → [1, 2, 3]

    unshift(...items) — Добавить в начало; возвращает новую длину.

    ⚠ Меняет исходный объект.

  • const a = [1, 2, 3]; const first = a.shift(); [first, a] // → [1, [2, 3]]

    shift() — Снять первый элемент и вернуть его.

    ⚠ Меняет исходный объект.

  • const a = ["a", "b", "c", "d"]; const removed = a.splice(1, 2, "X"); [removed, a] // → [["b", "c"], ["a", "X", "d"]]

    splice(start, deleteCount, ...items) — Удалить и/или вставить в середину; возвращает массив удалённых.

    ⚠ Меняет исходный объект.

  • [10, 9, 1].sort() // → [1, 10, 9]

    sort(compareFn?) — Сортирует на месте и возвращает тот же массив. Без функции сравнивает как строки!

    ⚠ Меняет исходный объект.

  • [10, 9, 1].sort((a, b) => a - b) // → [1, 9, 10]

    sort((a, b) => a - b) — Числовая сортировка по возрастанию.

    ⚠ Меняет исходный объект.

  • const a = [1, 2, 3]; a.reverse(); a // → [3, 2, 1]

    reverse() — Разворачивает на месте.

    ⚠ Меняет исходный объект.

  • new Array(3).fill(0) // → [0, 0, 0]

    fill(value, start?, end?) — Заполнить значением.

    ⚠ Меняет исходный объект.

  • [1, 2, 3, 4, 5].copyWithin(0, 3) // → [4, 5, 3, 4, 5]

    copyWithin(target, start, end?) — Скопировать часть массива внутрь него же.

    ⚠ Меняет исходный объект.

Array: возвращают новый массив

  • const a = [3, 1, 2]; const b = a.toSorted(); [a, b] // → [[3, 1, 2], [1, 2, 3]]

    toSorted(compareFn?) — Отсортированная копия, исходник не трогается.

    Исходник не меняется. Появился в ES2023.

  • [1, 2, 3].toReversed() // → [3, 2, 1]

    toReversed() — Развёрнутая копия.

    Исходник не меняется. Появился в ES2023.

  • ["a", "b", "c"].toSpliced(1, 1) // → ["a", "c"]

    toSpliced(start, deleteCount, ...items) — Копия с удалением и вставкой.

    Исходник не меняется. Появился в ES2023.

  • [1, 2, 3].with(-1, 9) // → [1, 2, 9]

    with(index, value) — Копия с заменой одного элемента; индекс может быть отрицательным.

    Исходник не меняется. Появился в ES2023.

  • [1, 2, 3].map((x) => x * 2) // → [2, 4, 6]

    map(fn) — Новый массив из результатов функции.

    Исходник не меняется.

  • [1, 2, 3, 4].filter((x) => x % 2 === 0) // → [2, 4]

    filter(fn) — Только элементы, для которых функция вернула истину.

    Исходник не меняется.

  • [1, 2, 3, 4].slice(1, -1) // → [2, 3]

    slice(start?, end?) — Кусок массива; end не включается, отрицательные считаются с конца.

    Исходник не меняется.

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

    concat(...arrays) — Склеить массивы.

    Исходник не меняется.

  • [1, [2, [3, [4]]]].flat(2) // → [1, 2, 3, [4]]

    flat(depth = 1) — Раскрыть вложенные массивы на заданную глубину.

    Исходник не меняется. Появился в ES2019.

  • ["a b", "c"].flatMap((s) => s.split(" ")) // → ["a", "b", "c"]

    flatMap(fn) — map, затем flat на один уровень.

    Исходник не меняется. Появился в ES2019.

  • Array.from({ length: 3 }, (_, i) => i * i) // → [0, 1, 4]

    Array.from(iterable, mapFn?) — Массив из итерируемого или «похожего на массив».

    Исходник не меняется.

  • Array.of(3) // → [3]

    Array.of(...items) — Массив из аргументов; в отличие от Array(3) не создаёт дыры.

    Исходник не меняется.

Array: свёртка и обход

  • [1, 2, 3].reduce((sum, x) => sum + x, 0) // → 6

    reduce(fn, initial) — Свернуть массив в одно значение. Без initial на пустом массиве — TypeError.

    Исходник не меняется.

  • [1, 2].forEach((x) => x) // → undefined

    forEach(fn) — Просто обойти; всегда возвращает undefined, прервать нельзя (для этого — for…of).

    Исходник не меняется.

  • ["a", "b", "c"].join(" / ") // → "a / b / c"

    join(separator = ",") — Склеить в строку.

    Исходник не меняется.

  • Array.from(["a", "b"].entries()) // → [[0, "a"], [1, "b"]]

    entries() — Итератор пар [индекс, значение] для for…of.

    Исходник не меняется.

  • Object.groupBy([1, 2, 3, 4], (x) => (x % 2 ? "odd" : "even")) // → { odd: [1, 3], even: [2, 4] }

    Object.groupBy(items, fn) — Разложить по группам в объект.

    Исходник не меняется. Появился в ES2024.

String

Строки неизменяемы: ни один метод не меняет исходную строку, все возвращают новую.

  • "Привет, мир".slice(-3) // → "мир"

    slice(start, end?) — Подстрока; отрицательные индексы считаются с конца.

    Исходник не меняется.

  • "Привет".substring(4, 1) // → "рив"

    substring(start, end?) — Как slice, но отрицательные превращаются в 0, а аргументы меняются местами, если start > end.

    Исходник не меняется.

  • "abc".at(-1) // → "c"

    at(index) — Символ по индексу, отрицательный — с конца.

    Исходник не меняется. Появился в ES2022.

  • "Привет".includes("иве") // → true

    includes(sub) — Есть ли подстрока.

    Исходник не меняется.

  • "file.tar.gz".endsWith(".gz") // → true

    startsWith(sub) / endsWith(sub) — Начинается или заканчивается ли строка на подстроку.

    Исходник не меняется.

  • "a,b,,c".split(",") // → ["a", "b", "", "c"]

    split(separator, limit?) — Разбить в массив.

    Исходник не меняется.

  • " текст \n".trim() // → "текст"

    trim() / trimStart() / trimEnd() — Убрать пробельные символы по краям, включая переводы строк.

    Исходник не меняется.

  • "7".padStart(3, "0") // → "007"

    padStart(length, fill) — Дополнить слева до длины.

    Исходник не меняется. Появился в ES2017.

  • "ab".padEnd(5, ".") // → "ab..."

    padEnd(length, fill) — Дополнить справа.

    Исходник не меняется. Появился в ES2017.

  • "ha".repeat(3) // → "hahaha"

    repeat(count) — Повторить строку.

    Исходник не меняется.

  • "a-b-c".replace("-", "+") // → "a+b-c"

    replace(pattern, replacement) — Заменить. Со строкой-образцом меняет только первое вхождение!

    Исходник не меняется.

  • "a-b-c".replaceAll("-", "+") // → "a+b+c"

    replaceAll(pattern, replacement) — Заменить все вхождения; регулярка обязана быть с флагом g.

    Исходник не меняется. Появился в ES2021.

  • "ёжик".toUpperCase() // → "ЁЖИК"

    toUpperCase() / toLowerCase() — Регистр. Для турецкого и подобных языков — toLocaleUpperCase("tr").

    Исходник не меняется.

  • ["ёж", "яма", "еда"].sort((a, b) => a.localeCompare(b, "ru")) // → ["еда", "ёж", "яма"]

    localeCompare(other, locale) — Сравнение по правилам языка — для сортировки.

    Исходник не меняется.

  • "a1b22c333".match(/\d+/g) // → ["1", "22", "333"]

    match(regexp) — Совпадение; с флагом g — массив всех совпадений без групп.

    Исходник не меняется.

  • Array.from("k1=v1;k2=v2".matchAll(/(\w+)=(\w+)/g), (x) => x[1]) // → ["k1", "k2"]

    matchAll(regexp) — Итератор всех совпадений с группами; регулярка обязана быть с флагом g.

    Исходник не меняется. Появился в ES2020.

  • "😀".codePointAt(0) // → 128512

    codePointAt(index) — Код символа, включая эмодзи из двух половинок.

    Исходник не меняется.

  • "й".normalize("NFD").length // → 2

    normalize("NFC") — Привести к одной форме Юникода: «й» из двух символов станет одним.

    Исходник не меняется.

  • ["😀".length, [..."😀"].length] // → [2, 1]

    [...str].length — Длина в символах, а не в UTF-16 единицах: length эмодзи — 2.

    Исходник не меняется.

Object и копирование

  • Object.entries({ a: 1, b: 2 }) // → [["a", 1], ["b", 2]]

    Object.keys / values / entries — Свои перечисляемые ключи, значения и пары.

    Исходник не меняется.

  • Object.fromEntries([["a", 1], ["b", 2]]) // → { a: 1, b: 2 }

    Object.fromEntries(pairs) — Объект из пар — обратное к entries.

    Исходник не меняется. Появился в ES2019.

  • const t = { a: 1 }; Object.assign(t, { b: 2 }); t // → { a: 1, b: 2 }

    Object.assign(target, ...sources) — Скопировать свойства в target; меняет и возвращает target.

    ⚠ Меняет исходный объект.

  • const o = { n: { x: 1 } }; const c = { ...o }; c.n === o.n // → true

    { ...obj } — Поверхностная копия: вложенные объекты остаются общими.

    Исходник не меняется.

  • const o = { n: { x: 1 } }; const c = structuredClone(o); c.n === o.n // → false

    structuredClone(value) — Глубокая копия, понимает Date, Map, Set и циклические ссылки. Функции не копирует.

    Исходник не меняется.

  • Object.hasOwn({ a: 1 }, "toString") // → false

    Object.hasOwn(obj, key) — Своё ли свойство — замена obj.hasOwnProperty(key).

    Исходник не меняется. Появился в ES2022.

  • const o = Object.freeze({ a: 1 }); Object.isFrozen(o) // → true

    Object.freeze(obj) — Запретить изменения. Заморозка поверхностная.

    Исходник не меняется.

  • [Object.is(NaN, NaN), Object.is(0, -0)] // → [true, false]

    Object.is(a, b) — Сравнение, где NaN равен NaN, а +0 не равен -0.

    Исходник не меняется.

  • JSON.stringify({ a: undefined, b: 1 }) // → "{\"b\":1}"

    JSON.stringify(value, null, 2) — В JSON с отступами. undefined и функции в объектах пропадают, Date становится строкой.

    Исходник не меняется.

  • JSON.parse("[1, 2]") // → [1, 2]

    JSON.parse(text, reviver?) — Из JSON; reviver превращает значения по ходу.

    Исходник не меняется.

Map и Set

  • const map = new Map([["a", 1]]); map.set("b", 2); [map.get("b"), map.size] // → [2, 2]

    new Map([[k, v]]) — Словарь с ключами любого типа и сохранением порядка вставки.

    Исходник не меняется.

  • [...new Set([1, 1, 2, 3, 3])] // → [1, 2, 3]

    new Set(iterable) — Множество уникальных значений — быстрый дедуп.

    Исходник не меняется.

  • new Set(["a"]).has("a") // → true

    set.has(value) — Проверка принадлежности за O(1), в отличие от includes у массива.

    Исходник не меняется.

  • [...new Set([1, 2]).union(new Set([2, 3]))] // → [1, 2, 3]

    a.union(b) / intersection / difference — Операции над множествами.

    Исходник не меняется. Появился в ES2025.

Promise и асинхронность

Результаты ниже — то, чем промис разрешается (как после await).

  • Promise.all([1, Promise.resolve(2)]) // → [1, 2]

    Promise.all(promises) — Ждать все; падает на первой ошибке.

    Исходник не меняется.

  • Promise.allSettled([Promise.reject(new Error("x"))]).then((r) => r[0].status) // → "rejected"

    Promise.allSettled(promises) — Ждать все и получить статус каждого, без падения.

    Исходник не меняется. Появился в ES2020.

  • Promise.race([new Promise((r) => setTimeout(r, 50, "медленно")), Promise.resolve("быстро")]) // → "быстро"

    Promise.race(promises) — Первый завершившийся — успехом или ошибкой. Основа таймаутов.

    Исходник не меняется.

  • Promise.any([Promise.reject(new Error("x")), Promise.resolve("ok")]) // → "ok"

    Promise.any(promises) — Первый успешный; ошибка — только если упали все (AggregateError).

    Исходник не меняется. Появился в ES2021.

  • const { promise, resolve } = Promise.withResolvers(); resolve(42); promise // → 42

    Promise.withResolvers() — Промис вместе с resolve и reject снаружи — без обёртки new Promise.

    Исходник не меняется. Появился в ES2024.

  • Promise.resolve(1).finally(() => 2) // → 1

    promise.finally(fn) — Выполнить в любом случае; результат промиса не меняет.

    Исходник не меняется. Появился в ES2018.

Числа и Math

  • [Number.isNaN("abc"), isNaN("abc")] // → [false, true]

    Number.isNaN(value) — Проверка на NaN без приведения; глобальный isNaN("abc") даёт true.

    Исходник не меняется.

  • Number.isInteger(5.0) // → true

    Number.isInteger(value) — Целое ли число.

    Исходник не меняется.

  • [Number.parseFloat("12.5px"), Number("12.5px")] // → [12.5, NaN]

    Number.parseFloat(str) — Число из начала строки; Number("12px") — NaN, parseFloat — 12.

    Исходник не меняется.

  • (1.005).toFixed(2) // → "1.00"

    toFixed(digits) — Строка с фиксированным числом знаков — именно строка, не число.

    Исходник не меняется.

  • [Math.round(-2.5), Math.trunc(-2.7), Math.floor(-2.1), Math.ceil(2.1)] // → [-2, -2, -3, 3]

    Math.round / trunc / floor / ceil — round(-2.5) даёт -2: половина округляется вверх, к +∞.

    Исходник не меняется.

  • Math.max(...[]) // → -Infinity

    Math.max(...arr) — Максимум; от пустого массива — -Infinity.

    Исходник не меняется.

  • [0.1 + 0.2 === 0.3, Math.abs(0.1 + 0.2 - 0.3) < Number.EPSILON] // → [false, true]

    0.1 + 0.2 — Двоичная дробь: сравнивать с допуском Number.EPSILON или считать в копейках.

    Исходник не меняется.

  • new Intl.NumberFormat("en-US", { style: "currency", currency: "USD" }).format(1234.5) // → "$1,234.50"

    Intl.NumberFormat — Числа и валюты по правилам языка.

    Исходник не меняется.