JavaScript не сбрасывает переменную в цикле

хотел бы спросить причину, почему 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]);

Буду благодарен за каждый ответ. Спасибо.

потому что splice модифицирует массив на месте.

Hunter McMillen 09.04.2018 18:55

Ваш var testArray=sequence не создает новый массив, а просто ссылается на последовательность. Итак, когда вы склеиваете testArray, вы также склеиваете последовательность. Если вы хотите его сбросить, вам понадобится var testArray = sequence.slice()

Matt 09.04.2018 18:56

Возможный дубликат Цикл по массиву и удаление элементов без разрыва цикла

Mohammad Usman 09.04.2018 18:57

@MohammadUsman Его проблема заключается в том, что он не понимает, что объединение удаляет индекс, в то время как цикл продолжается, вызывая случайный пропуск индекса. Его проблема не в понимании присвоения переменных и того, что передает ссылку и что передает значение. Удалите или обновите свой комментарий.

Matt 09.04.2018 19:08

Если этот ответ был полезен, можете ли вы отметить его как ответ?

Matt 16.04.2018 19:49
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
1 049
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как указано в комментарии выше, вы запутались с назначением переменных.

В №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]);

Другие вопросы по теме