为什么代码在我写 myArray[i] 而不是当我将 myArray[i] 保存在变量中时有效?

问题描述

我想用经典的 fizzbuzz 游戏填充一个空的 array(从 1 到 100 的数字,当一个数字可以被 3 整除时,打印 'Fizz,可被 5 整除打印 'Buzz',可以被 3 和5 打印“Fizzbuzz”)。问题是,当我像下面代码的第一部分那样编写代码时,将我的 array[i] 保存在一个更方便的变量中,我的 if-else if 语句不起作用,只打印正常数字;但是当我使用 array[i] 而不是变量时一切正常,正如您在代码的第二部分中看到的那样,其中 'Fizz'、'Buzz'、'FizzBu​​zz' 覆盖了正常数字。它们应该是一样的吧?

代码的第一部分用变量代替 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);

解决方法

重新分配变量本身永远不会有任何副作用(除非在最罕见的情况下不值得担心)。执行 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);

,

在 JavaScript 中,变量只是对对象的引用,并且赋值会更改它指向的位置。在

thisNumber = 'FizzBuzz';

您创建一个新的字符串对象并使用 thisNumber 引用它。在

numberArray[i] = 'FizzBuzz';

您修改数组 numberArray 的第 i 个元素。

您不能创建对数组元素的引用并通过赋值修改它。这在 JavaScript 中是不可能的。