Почему код работает, когда я пишу myArray[i], а не когда я сохраняю myArray[i] в ​​переменной?

Я хочу заполнить пустое array классической игрой fizzbuzz (числа от 1 до 100, когда число делится на 3, печатает «Fizz», делится на 5, печатает «Buzz», делится на 3 и 5, печатает «Fizzbuzz»). Проблема в том, что когда я пишу код, как в первой части кода ниже, сохраняя мой array[i] в более удобной переменной, мой оператор if-else if не работает, печатаются только обычные числа; но когда я использую array[i] вместо переменной, все работает нормально, как вы можете видеть во второй части кода, где 'Fizz', 'Buzz', 'FizzBuzz' перезаписывают обычные числа. Они должны быть одинаковыми, верно?

Первая часть кода с переменной вместо array[i]

var numberArray = [];
var number = 0

for (var i = 0; i < 100; i++) {
    number += 1;
    thisNumber = numberArray[i];
    numberArray.push(number);

    if (number %3 ==0 && number %5 ==0) {
        thisNumber = 'FizzBuzz';
    } else if ( number %3 ==0 ) {
        thisNumber = 'Fizz';
    } else if ( number %3 ==0 ) {
        thisNumber = 'Buzz';
    }
}

console.log(numberArray);

Вторая часть кода с массивом[i] вместо переменной

var numberArray = [];
var number = 0

for (var i = 0; i < 100; i++) {
    number += 1;
    numberArray.push(number);

    if (number %3 ==0 && number %5 ==0) {
        numberArray[i] = 'FizzBuzz';
    } else if ( number %3 ==0 ) {
        numberArray[i] = 'Fizz';
    } else if ( number %3 ==0 ) {
        numberArray[i] = 'Buzz';
    }
}

console.log(numberArray);

person Alebacce    schedule 27.03.2021    source источник


Ответы (2)


Переназначение переменной само по себе никогда не имеет побочных эффектов (за исключением самых редких ситуаций, о которых не стоит беспокоиться). Выполнение thisNumber = 'FizzBuzz'; ничего не меняет в том, как thisNumber могло использоваться в прошлом.

Нажмите после назначения thisNumber. Вы также хотите нажать thisNumber, а не number.

Вам также нужно изменить конечный % 3 на % 5 — в настоящее время вы дважды тестируете % 3.

var numberArray = [];
for (var i = 0; i < 100; i++) {
  let thisNumber = i;
  if (i % 3 == 0 && i % 5 == 0) {
    thisNumber = 'FizzBuzz';
  } else if (i % 3 == 0) {
    thisNumber = 'Fizz';
  } else if (i % 5 == 0) {
    thisNumber = 'Buzz';
  }
  numberArray.push(thisNumber);
}

console.log(numberArray);

person CertainPerformance    schedule 27.03.2021
comment
Я пробовал с вашим кодом, но он работает с индексами, а это не то, что мне нужно, потому что я хочу работать с их содержимым. Это из-за моей ошибки, так как я разместил вопрос в начале, написав thisNumber = I, а не thisNumber =numberArray[i], как должно быть. Прошу прощения, все равно правильно отредактировал вопрос - person Alebacce; 27.03.2021
comment
Код в моем ответе не использует индексы - пожалуйста, посмотрите на него еще раз. Основное изменение в логике моего ответа заключается в том, что число помещается в конец цикла, а не в начало цикла. (Если вы нажмете число, а затем переназначите переменную, указывающую на число, массив не изменится.) - person CertainPerformance; 27.03.2021

В JavaScript переменная — это просто ссылка на объект, и присваивание изменяется там, где она указывает. В

thisNumber = 'FizzBuzz';

вы создаете новый строковый объект и ссылаетесь на него с помощью thisNumber. В

numberArray[i] = 'FizzBuzz';

вы изменяете i-й элемент массива numberArray.

Вы не можете создать ссылку на элемент массива и изменить его с помощью присваивания. Это невозможно в JavaScript.

person Thomas Sablik    schedule 27.03.2021