问题描述
我想用经典的 fizzbuzz 游戏填充一个空的 array
(从 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);
解决方法
重新分配变量本身永远不会有任何副作用(除非在最罕见的情况下不值得担心)。执行 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 中是不可能的。