Как синтаксис распространения влияет на сращивание массива

Я нашел следующий код, и я не знаю, в чем разница между A и B:

var fruits = ["Banana", "Orange", "Apple", "Mango"];

fruits.splice(2,0,["Lemon", "Kiwi"]);

В

fruits.splice(...[2,0].concat(["Lemon", "Kiwi"]));

var fruits = ["Banana", "Orange", "Apple", "Mango"];
var A = fruits.splice(2, 0, ["Lemon", "Kiwi"]);
var B = fruits.splice(...[2, 0].concat(["Lemon", "Kiwi"]));

console.log(A)
console.log(B)

Ответы

Ответ 1

Прежде всего, оператор A & Statement B будет генерировать разные результаты.

В Statement A вы вставляете массив (["Lemon", "Kiwi"]) в качестве элемента массива в позиции 2 при удалении 0 элементов. Итак, вы вставляете строковый массив в другой массив строк в позиции 2.

var fruits = ["Banana", "Orange", "Apple", "Mango"];


fruits.splice(2,0,["Lemon", "Kiwi"]);

console.log(fruits);

Ответ 2

A обрабатывает ["Lemon", "Kiwi"] как один элемент и вставляет его в заданный индекс

["Banana", "Orange", ["Lemon", "Kiwi"], "Apple" , "Mango"];

B concats [2,0] и ["Lemon", "Kiwi"] а затем передает их для сращивания в качестве разделенных запятыми аргументов, таких как

fruits.splice(2,0,"Lemon", "Kiwi");  

которые изменяют массив, как показано ниже

["Banana", "Orange", "Lemon", "Kiwi", "Apple", "Mango"]

Ответ 3

Согласно документу от сигнатуры функции:

array.splice(start[, deleteCount[, item1[, item2[,...]]]])

В B:

fruits.splice(...[2,0].concat(["Lemon", "Kiwi"]));

Потому что [2,0].concat(["Lemon", "Kiwi"]) означает [2,0,"Lemon", "Kiwi"].

Итак, fruits.splice(...[2,0,"Lemon", "Kiwi"]); становится fruits.splice(2,0,"Lemon", "Kiwi"); используя оператор спреда (...).

Над кодом вы говорите, добавьте "Lemon", "Kiwi", из индекса 2 удалив 0 предметов.

В этом случае 2 является start индексом, deleteCount равен 0, а item1 - "Lemon", item2 - "Kiwi".

Теперь в A:

fruits.splice(2,0,["Lemon", "Kiwi"]);

Вы говорите, добавьте ["Lemon", "Kiwi"] из индекса 2 с удалением 0 элементов. В этом случае 2 является start индексом, deleteCount равен 0, а item1 - ["Lemon", "Kiwi"].

Ответ 4

Прежде всего вам нужно понять, как работает сплайсинг

array.splice(start [, deleteCount [, item1 [, item2 [,...]]]])

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

Теперь вы понятны с помощью сращивания, поэтому отпустите шаг за шагом, чтобы получить более четкое представление об этих состояниях.

Следующее утверждение

fruits.splice(...[2,0].concat(["Lemon", "Kiwi"])); 

после конкатенации становится

fruits.splice(...[2,0,"Lemon", "Kiwi"]);

после распространения он становится

fruits.splice(2,0,"Lemon", "Kiwi");

то сращивание будет извлекать фрукты из индекса 2 и ничего не удалять (как задано ноль) и добавлять остальные аргументы, т.е. "Лимон" и "Киви",

Итак, вы получаете ["Banana", "Orange", "Lemon", "Kiwi", "Apple", "Mango"]

Где, как в

fruits.splice(2,0,["Lemon", "Kiwi"]);

сплайсинг будет извлекать фрукты из индекса 2 и ничего не удалять (опять же, как задано ноль) и добавлять остальные аргументы, т.е. "[" Лимон "," Киви "]

Итак, вы получаете ["Banana", "Orange", ["Lemon", "Kiwi"], "Apple", "Mango"]

Я надеюсь, что это помогает.

Ответ 5

Без использования спреда B:

fruits.splice( 2, 0, "Lemon", "Kiwi" );

concat немного запутан, он также может быть написан как:

fruits.splice( ...[ 2, 0 ], ...[ "Lemon", "Kiwi" ] );

Или же:

fruits.splice( ...[ 2, 0, "Lemon", "Kiwi" ] );

Ответ 6

Все остальные ответы правильно описывают метод splice и поведение оператора распространения, но никто не пытается исправить ваше недоразумение относительно результата.

То, что вы на самом деле видите, является возвращаемым значением метода splice, который представляет собой массив, содержащий удаленные элементы, которые в обоих вызовах метода не являются. Вот почему вы получаете пустой массив в качестве результата.

Чтобы увидеть поведение метода вызова splice, вам необходимо зарегистрировать массив fruits после каждого вызова (а не возвращаемого значения метода), который в вашем случае не так полезен, потому что ваши ожидания относительно массива fruits не сохраняются в второй вызов.