evgeniy8705
@evgeniy8705
Повелитель вселенной

Как понять строку кода. (метод splice и оператор ...)?

Попробовал написать функцию копирования участка массива и вставка в определенный индекс этого же массива. (аналог встроенного метода Array.prototype.copyWithin).

let copyWithin = (arr, index, startIndex = 0, endIndex = arr.length) => {
  startIndex = startIndex < 0 ? arr.length + startIndex : startIndex;
  endIndex = endIndex < 0 ? arr.length + endIndex : endIndex;

  let tmpArr = [];

  for (let i = startIndex; i < endIndex; i += 1) {
    tmpArr.push(arr[i]);
  }

  arr.splice(index, tmpArr.length, ...tmpArr);
};

let arr = [1, 2, 3, 4, 5];

copyWithin(arr, 1, 2, 4);

console.log(arr); // [1, 3, 4, 4, 5]


В конце начиная с определенного индекса удаляю количество элементов равное длине копированного участка и на их место вставляю копию.

arr.splice(index, tmpArr.length, ...tmpArr);

Для вставки элементов копии использовал оператор "..."
Посмотрел транспилированный код. Хотел узнать как будет организована вставка именно элементов скопированного массива, а не самого массива, без оператора "..."

В итоге в транспилировнном коде получилась строка:
arr.splice.apply(arr, [index, tmpArr.length].concat(tmpArr));


В общем, объясните, как понять эту строку. Вообще догнать не могу как она устроена. Какие шаги выполняются.
Что это за конструкция?
[index, tmpArr.length].concat(tmpArr)
  • Вопрос задан
  • 212 просмотров
Решения вопроса 1
Finesse
@Finesse
Метод apply функции вызывает эту функцию с указанными аргументами. Первый аргумент метода apply — значение переменой this внутри функции во время её выполнения, а второй — список аргументов в виде массива.

Метод concat массива объединяет его с другими массивами. Если конкретней, то к массиву, на котором он вызван, добавляет содержимое массивов из всех аргументов и возвращает итоговый массив. При этом массив, на котором вызван этот метод, остаётся неизменным.

В строке
arr.splice.apply(arr, [index, tmpArr.length].concat(tmpArr));
сначала составляется список аргументов с помощью метода concat (массив аргументов, переданных по-обычному, объединяется с аргументами, переданными через оператор ...), затем с помощью apply вызывается метод splice массива и ему передаётся составленный массив аргументов.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы