хотел бы спросить причину, почему JavaScript не сбрасывает переменную после каждой итерации цикла, в ситуации, когда я пытаюсь установить его равным аргументу функции (# 1). Он выполняет сброс, если переменная равна определенному массиву (# 2).
#1
function almostIncreasingSequence(sequence) {
for (var i = 0; i < sequence.length; i++) {
var testArray=sequence;
testArray.splice(i, 1);
console.info(testArray);
}
}
almostIncreasingSequence([1, 3, 2, 1]);
#2
function almostIncreasingSequence(sequence) {
for (var i = 0; i < sequence.length; i++) {
var testArray=[1, 3, 2, 1];
testArray.splice(i, 1);
console.info(testArray);
}
}
almostIncreasingSequence([1, 3, 2, 1]);
Буду благодарен за каждый ответ. Спасибо.
Ваш var testArray=sequence не создает новый массив, а просто ссылается на последовательность. Итак, когда вы склеиваете testArray, вы также склеиваете последовательность. Если вы хотите его сбросить, вам понадобится var testArray = sequence.slice()
Возможный дубликат Цикл по массиву и удаление элементов без разрыва цикла
@MohammadUsman Его проблема заключается в том, что он не понимает, что объединение удаляет индекс, в то время как цикл продолжается, вызывая случайный пропуск индекса. Его проблема не в понимании присвоения переменных и того, что передает ссылку и что передает значение. Удалите или обновите свой комментарий.
Если этот ответ был полезен, можете ли вы отметить его как ответ?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Как указано в комментарии выше, вы запутались с назначением переменных.
В №1 у вас сложилось впечатление, что var testArray = sequence; - это то же самое, что сказать var testArray = [1, 3, 2, 1]. Это не так. var testArray = sequence - это просто ссылка на последовательность. Все, что вы изменяете в testArray, обращается к sequence и также модифицирует его там.
Чтобы исправить №1, чтобы он работал как №2, вам нужно будет сделать var testArray = sequence.slice(). Это выполняет неглубокую копию sequence, так что модификация testArray не влияет на sequence.
function almostIncreasingSequence(sequence) {
for (var i = 0; i < sequence.length; i++) {
var testArray=sequence.slice();
testArray.splice(i, 1);
console.info(testArray);
}
}
almostIncreasingSequence([1, 3, 2, 1]);
потому что
spliceмодифицирует массив на месте.