为什么这个JavaScript开关语句(位于for循环中)保留了上一次迭代中的值? 是的,在问1.5个多小时之前,我花了我那部分时间寻找相关答案。
该函数用于将数字转换为罗马数字 它接受传递给它的数字参数 将数字拆分为数字 然后将转换为数组 然后根据数字的十次幂或与数字长度相关的位置设置低、中、高值 然后,这些值按罗马数字指示的顺序应用,并推送到字符串中 最后,返回字符串。 它适用于数字出现不超过一次的数字。这样做的原因是,当for循环中多次匹配开关情况时,它会应用上一次迭代中的低、中、高值 这个问题在标题中,但我也想问一个问题的解决方案,我正试图解决请。 我很乐意提供更多信息,并回答每一个问题为什么这个JavaScript开关语句(位于for循环中)保留了上一次迭代中的值? 是的,在问1.5个多小时之前,我花了我那部分时间寻找相关答案。,javascript,variables,for-loop,switch-statement,roman-numerals,Javascript,Variables,For Loop,Switch Statement,Roman Numerals,该函数用于将数字转换为罗马数字 它接受传递给它的数字参数 将数字拆分为数字 然后将转换为数组 然后根据数字的十次幂或与数字长度相关的位置设置低、中、高值 然后,这些值按罗马数字指示的顺序应用,并推送到字符串中 最后,返回字符串。 它适用于数字出现不超过一次的数字。这样做的原因是,当for循环中多次匹配开关情况时,它会应用上一次迭代中的低、中、高值 这个问题在标题中,但我也想问一个问题的解决方案,我正试图解决请。 我很乐意提供更多信息,并回答每一个问题 因为Javascript使用函数闭包,而您的
因为Javascript使用函数闭包,而您的循环在默认情况下不会重置值,换句话说,for中的变量仍然存在于for之外。在for循环中声明为var的变量不会在每次迭代中重置,这与开关无关 尝试将其粘贴到控制台中-
function convertToRoman(num) {
//seperate the number in to singular digits which are strings and pass to array.
var array = ("" + num).split(""),
arrayLength = array.length,
romStr = "";
//Convert the strings in the array to numbers
array = array.map(Number);
//Itterate over every number in the array
for (var i = 0; i < array.length; i++) {
//Calculate what power of ten the digit is by minusing it's index from the array length and passing it to variable "tenToPowerOf"
var tenToPowerOf = arrayLength - array.indexOf(array[i]) - 1,
low = "",
mid = "",
upp = "";
//Set the low, mid and high variables based on their tenToPowerOf value
switch (tenToPowerOf) {
case 0:
low = "I";
mid = "V";
upp = "X";
break;
case 1:
low = "X";
mid = "L";
upp = "C";
break;
case 2:
low = "C";
mid = "D";
upp = "M";
break;
case 3:
low = "M";
mid = "¯V";
upp = "¯X";
break;
}
//Check for digit value and add it's Roman Numeral value (based on it's power from the above switch statement) to romStr
//The problem is, switch "remembers" the value of low, mid and high from the last time it itterated over the number. Thus 99 becomes "XCXC" and not "XCIX".
switch (array[i]) {
case 1:
romStr += low;
break;
case 2:
romStr += low.repeat(2);
break;
case 3:
romStr += low.repeat(3);
break;
case 4:
romStr += low + mid;
break;
case 5:
romStr += mid;
break;
case 6:
romStr += mid + low;
break;
case 7:
romStr += mid + low.repeat(2);
break;
case 8:
romStr += mid + low.repeat(3);
break;
case 9:
romStr += low + upp;
break;
case 10:
romStr += upp;
break;
default:
break;
}
}
//return array;
return romStr;
}
convertToRoman(99);
在我看来,您的问题在于使用array.indexOfarray[i]来计算功率。猜猜看,如果数组中有两个相同的值,则返回第一个找到的索引,而不是当前元素的索引 猜猜当前元素的索引实际上是什么?→ 我 不需要索引
与开关无关。能否请您在实际问题中加入相关代码?感谢您回答和编辑我的问题。这解决了我的问题。
for (var i = 1; i <= 10; i++)
{
console.log('before', i, j);
var j = i * 10;
console.log('after', i, j);
}
for (var i = 1; i <= 10; i++)
{
var j = null;
console.log('before', i, j);
j = i * 10;
console.log('after', i, j);
}