Array.prototype.concat()

Метод concat() (зчепити) використовується для злиття двох і більше масивів. Він не змінює наявні масиви, а повертає новий.

Спробуйте його в дії

Синтаксис

concat()
concat(value1)
concat(value1, value2)
concat(value1, value2, /* …, */ valueN)

Параметри

value1, …, valueN Необов'язкове

Масиви та (або) значення, котрі слід злити в новий масив. Якщо всі параметри опущені, то valueN, concat повертає поверхневу копію наявного масиву, на котрому його викликали.

Повернене значення

Новий примірник Array.

Опис

Метод concat створює новий масив. Цей масив спершу наповнюється елементами об'єкта, на котрому concat викликали. Далі значення кожного аргументу причіплюється до масиву: для звичайних об'єктів чи примітивів – сам аргумент стає елементом результівного масиву, а для масивів чи масивоподібних об'єктів зі властивістю Symbol.isConcatSpreadable, що має значення істинності, кожен елемент аргументу буде окремо доданий до результівного масиву. Метод concat не виконує рекурсії на вкладених масивах аргументів.

Метод concat() є копіювальним методом. Він не змінює ані this, ані жодного з масивів, переданих як аргументи, а натомість повертає поверхневу копію, що містить ті самі елементи, що були у вихідних масивах.

Метод concat() зберігає порожні комірки, якщо будь-який із вихідних масивів є розрідженим.

Метод concat() є узагальненим. Значення this обробляється так само, як решта аргументів (окрім того, що воно спершу перетворюється на об'єкт), а отже – прості об'єкти будуть просто поставлені в початок результівного масиву, а масивоподібні об'єкти з істинною властивістю [Symbol.isConcatSpreadable] будуть розгорнуті в результівний масив.

Приклади

Зчеплення двох масивів

Наступний код зчіплює два масиви:

const letters = ["a", "b", "c"];
const numbers = [1, 2, 3];

const alphaNumeric = letters.concat(numbers);
console.log(alphaNumeric);
// дає ['a', 'b', 'c', 1, 2, 3]

Зчеплення трьох масивів

Наступний код зчіплює три масиви:

const num1 = [1, 2, 3];
const num2 = [4, 5, 6];
const num3 = [7, 8, 9];

const numbers = num1.concat(num2, num3);

console.log(numbers);
// дає [1, 2, 3, 4, 5, 6, 7, 8, 9]

Зчеплення значень у масив

Наступний код зчіплює три значення в масив:

const letters = ["a", "b", "c"];

const alphaNumeric = letters.concat(1, [2, 3]);

console.log(alphaNumeric);
// дає ['a', 'b', 'c', 1, 2, 3]

Зчеплення вкладених масивів

Наступний код зчіплює вкладені масиви й демонструє збереження посилань:

const num1 = [[1]];
const num2 = [2, [3]];

const numbers = num1.concat(num2);

console.log(numbers);
// дає [[1], 2, [3]]

// змінити перший елемент num1
num1[0].push(4);

console.log(numbers);
// дає [[1, 4], 2, [3]]

Зчеплення масивоподібних об'єктів за допомогою Symbol.isConcatSpreadable

concat усталено не розглядає всі масивоподібні об'єкти як масиви: він це робить лише якщо властивість Symbol.isConcatSpreadable має значення істинності (наприклад, true.)

const obj1 = { 0: 1, 1: 2, 2: 3, length: 3 };
const obj2 = { 0: 1, 1: 2, 2: 3, length: 3, [Symbol.isConcatSpreadable]: true };
console.log([0].concat(obj1, obj2));
// [ 0, { '0': 1, '1': 2, '2': 3, length: 3 }, 1, 2, 3 ]

Використання concat() на розріджених масивах

Якщо будь-який з вихідних масивів є розрідженим, то результівний масив також буде розрідженим:

console.log([1, , 3].concat([4, 5])); // [1, порожньо, 3, 4, 5]
console.log([1, 2].concat([3, , 5])); // [1, 2, 3, порожньо, 5]

Виклик concat() на об'єктах-немасивах

Якщо значення this не є масивом, то воно спершу перетворюється на об'єкт, а тоді обробляється так само, як аргументи concat(). В цьому випадку повернене значення завжди є новим звичайним масивом.

console.log(Array.prototype.concat.call({}, 1, 2, 3)); // [{}, 1, 2, 3]
console.log(Array.prototype.concat.call(1, 2, 3)); // [ [Number: 1], 2, 3 ]
const arrayLike = {
  [Symbol.isConcatSpreadable]: true,
  length: 2,
  0: 1,
  1: 2,
  2: 99, // ігнорується concat(), оскільки length – 2
};
console.log(Array.prototype.concat.call(arrayLike, 3, 4)); // [1, 2, 3, 4]

Специфікації

Сумісність із браузерами

desktop mobile server
Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet Deno Node.js
concat
Chrome Full support 1
Edge Full support 12
Firefox Full support 1
Internet Explorer Full support 5.5
Opera Full support 4
Safari Full support 1
WebView Android Full support 1
Chrome Android Full support 18
Firefox for Android Full support 4
Opera Android Full support 10.1
Safari on iOS Full support 1
Samsung Internet Full support 1.0
Deno Full support 1.0
Node.js Full support 0.10.0

Дивіться також