Как синтаксис распространения влияет на сращивание массива
Я нашел следующий код, и я не знаю, в чем разница между 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
не сохраняются в второй вызов.