为什么这个JavaScript开关语句(位于for循环中)保留了上一次迭代中的值? 是的,在问1.5个多小时之前,我花了我那部分时间寻找相关答案。

为什么这个JavaScript开关语句(位于for循环中)保留了上一次迭代中的值? 是的,在问1.5个多小时之前,我花了我那部分时间寻找相关答案。,javascript,variables,for-loop,switch-statement,roman-numerals,Javascript,Variables,For Loop,Switch Statement,Roman Numerals,该函数用于将数字转换为罗马数字 它接受传递给它的数字参数 将数字拆分为数字 然后将转换为数组 然后根据数字的十次幂或与数字长度相关的位置设置低、中、高值 然后,这些值按罗马数字指示的顺序应用,并推送到字符串中 最后,返回字符串。 它适用于数字出现不超过一次的数字。这样做的原因是,当for循环中多次匹配开关情况时,它会应用上一次迭代中的低、中、高值 这个问题在标题中,但我也想问一个问题的解决方案,我正试图解决请。 我很乐意提供更多信息,并回答每一个问题 因为Javascript使用函数闭包,而您的

该函数用于将数字转换为罗马数字

它接受传递给它的数字参数 将数字拆分为数字 然后将转换为数组 然后根据数字的十次幂或与数字长度相关的位置设置低、中、高值 然后,这些值按罗马数字指示的顺序应用,并推送到字符串中 最后,返回字符串。 它适用于数字出现不超过一次的数字。这样做的原因是,当for循环中多次匹配开关情况时,它会应用上一次迭代中的低、中、高值

这个问题在标题中,但我也想问一个问题的解决方案,我正试图解决请。 我很乐意提供更多信息,并回答每一个问题
因为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);
}