Concat: примеры (JAVASCRIPT)

Метод concat в JavaScript для объединения данных
Раздел: Строки, Объединение
concat(...values): array|string

Основы метода concat

Метод concat() (от "concatenate" - объединять) является стандартным методом объектов типа Array и String в JavaScript. Его главная задача - создание нового массива или строки путем объединения исходного значения с другими значениями или массивами, переданными в качестве аргументов.

Использование метода актуально, когда требуется объединить данные, сохранив исходные массивы или строки неизменными. В отличие от оператора присваивания или некоторых мутирующих методов, concat() не изменяет исходный объект, а возвращает совершенно новый.

Аргументы

Метод принимает любое количество аргументов. В качестве аргументов могут выступать:

  • Примитивные значения (числа, строки, булевы значения, null, undefined, Symbol).
  • Объекты, включая другие массивы (для Array.prototype.concat) или любые значения (для String.prototype.concat).

Если аргумент является массивом, то при вызове на массиве, его элементы будут добавлены по отдельности, а не как вложенный массив ("распаковка" на один уровень).

Возвращаемое значение

Метод всегда возвращает новый массив или строку, содержащий элементы (символы) исходного объекта, за которыми следуют элементы (символы) каждого переданного аргумента в порядке их следования. Возвращаемый тип соответствует типу исходного объекта, на котором вызван метод.

Краткие примеры использования

Работа с массивами

Объединение массивов с примитивами и другими массивами:

const arr1 = [1, 2];
const arr2 = [3, 4];
const result = arr1.concat(arr2, 5, [6, 7]);
console.log(result);
[1, 2, 3, 4, 5, 6, 7]

Работа со строками

Склеивание строк:

const str1 = "Hello";
const resultStr = str1.concat(" ", "World", "!");
console.log(resultStr);
"Hello World!"

Передача различных типов аргументов

const base = ['a'];
const res = base.concat(true, null, undefined, [[1, 2]], {key: 'val'});
console.log(res);
['a', true, null, undefined, [1, 2], {key: 'val'}]

Аналогичные методы в JavaScript

Для объединения данных в JavaScript существуют и другие способы.

Оператор spread (...) (для массивов и строк) - современный и часто более удобный синтаксис. Позволяет легко объединять несколько массивов: const newArr = [...arr1, ...arr2];. Для строк результат аналогичен concat().

Array.prototype.push() - мутирующий метод, который добавляет элементы в конец исходного массива. В отличие от concat(), изменяет оригинальный массив.

Оператор + или шаблонные строки (для строк) - простейший способ сложения строк: const str = str1 + ' ' + str2; или const str = `${str1} ${str2}`;.

Выбор метода зависит от задачи. concat() предпочтителен, когда нужна явная читаемость операции объединения без мутаций. Оператор spread стал стандартом для массивов в современном коде благодаря лаконичности. Методы вроде push используют, когда изменение исходного массива допустимо.

Распространенные ошибки

1. Ожидание мутации исходного массива. Метод не изменяет исходный объект.

const arr = [1, 2];
arr.concat([3, 4]);
console.log(arr); // Ожидание: [1,2,3,4], реальность: [1,2]
[1, 2]

2. Попытка вызвать на null или undefined. Метод существует только у объектов Array и String.

let val = null;
val.concat([1]); // Ошибка TypeError

3. Забывание, что concat раскрывает только один уровень вложенности массива.

const arr = [1];
const nested = [[2, 3], 4];
const res = arr.concat(nested);
console.log(res); // Элемент [2,3] останется массивом
[1, [2, 3], 4]

4. Смешивание вызовов для строк и массивов. Синтаксис похож, но результаты принципиально разные.

Изменения в спецификации

Метод Array.prototype.concat и String.prototype.concat существуют с первых версий ECMAScript и остаются стабильными. Существенных изменений в их работе не было.

Важным контекстным изменением стало появление в ES6 (ECMAScript 2015) оператора расширения ..., который в большинстве сценариев объединения массивов выступает более удобной альтернативой, но не заменяет concat полностью. Также в современных версиях JavaScript движки оптимизируют производительность метода.

Расширенные примеры применения

1. Создание иммутабельных цепочек обновлений данных (часто используется в Redux-редюсерах).

Пример javascript
const initialState = [{id: 1, name: 'Item 1'}];
const newItem = {id: 2, name: 'Item 2'};
const updatedState = initialState.concat(newItem);
console.log(initialState);
console.log(updatedState);
[{id: 1, name: 'Item 1'}]
[{id: 1, name: 'Item 1'}, {id: 2, name: 'Item 2'}]

2. Эмуляция метода flat() для раскрытия одного уровня вложенности.

Пример javascript
const nested = [[1, 2], [3, 4], 5];
const flattened = [].concat(...nested); // Применение spread для аргументов concat
console.log(flattened);
[1, 2, 3, 4, 5]

3. Объединение с обработкой возможного undefined или null источника с помощью логического оператора ИЛИ.

Пример javascript
const maybeArray = undefined;
const safeArray = (maybeArray || []).concat([1, 2]);
console.log(safeArray);
[1, 2]

4. Конкатенация строк с разделителем, альтернатива join для небольшого числа строк.

Пример javascript
const parts = ['protocol', 'domain', 'path'];
const url = ''.concat(
  parts[0], '://',
  parts[1], '/',
  parts[2]
);
console.log(url);
"protocol://domain/path"

5. Объединение массивоподобных объектов (arguments, NodeList) после приведения.

Пример javascript
function mergeArgs() {
    return [].concat(...arguments); // Используем spread для преобразования arguments
}
console.log(mergeArgs([1], [2, 3], 4));
[1, 2, 3, 4]

Аналоги функции в других языках

Концепция объединения последовательностей распространена.

PHP: Функция array_merge() для массивов и оператор . для строк.

// PHP
$arr1 = [1, 2];
$arr2 = [3, 4];
$result = array_merge($arr1, $arr2); // [1, 2, 3, 4]
$str = "Hello " . "World"; // "Hello World"

Python: Для списков - оператор + или метод extend() (мутирующий). Для строк - оператор + или join().

# Python
list1 = [1, 2]
list2 = [3, 4]
new_list = list1 + list2  # [1, 2, 3, 4]
str_res = "Hello " + "World"  # "Hello World"

MySQL: Функция CONCAT() для объединения строк из результатов запроса.

-- MySQL
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;

C++: Для строк (std::string) используется оператор + или метод append(). Для контейнеров (vector) - метод insert() с итераторами.

Главное отличие JavaScript-метода concat - его универсальность для работы с разными типами аргументов и автоматическая "распаковка" массивов при вызове на массиве.

JS concat function comments

En
Concat Combines two or more arrays/strings and returns a new array/string