在 JavaScript 中的 for 循环中重新分配变量的目的是什么?

what is the purpose of reassigning a variable inside a for loop in JavaScript?

本文关键字:变量 分配 是什么 for 中的 JavaScript 循环 新分配      更新时间:2023-09-26

>我是初学者,所以我正在解决一个练习,这是一个返回字符串中第一个不重复字母的函数,我的答案根本不起作用,所以当我查看解决方案时,我发现它与我的相似,只是答题表在 for 循环中重新分配了一个全局变量, 重新分配甚至没有改变变量的值。您能否解释一下为什么需要重新分配才能使该功能正常工作。

这是我的代码:

function find(str) {  
  var array = str.split('');  
  var result = '';  
  var counter = 0; // counter declared here 
  for (var x = 0; x < array.length; x++) {  
    //counter missing here
    for (var y = 0; y < array.length; y++) {  
      if (array[x] === array[y]) { counter = counter + 1;} 
    }  

    if (counter < 2) {  
      result = array[x];  
      break;  
    }  
  }  

  return result;  
}

这是答卷中正常工作的代码:

function find(str) {  
  var array = str.split('');  
  var result = '';  
  var counter = 0;  //counter declared here
  for (var x = 0; x < array.length; x++) {  
    counter = 0; //counter is reassigned here 
    for (var y = 0; y < array.length; y++) {  
      if (array[x] === array[y]) { counter = counter + 1;} 
    }  

    if (counter < 2) {  
      result = array[x];  
      break;  
    }  
  }  

  return result;  
}

重新分配甚至没有改变变量的值。

是的,确实如此。

请注意,counter 变量应该是外部循环的局部变量,而不是两个循环的全局变量(如在代码中那样)。最好写

function find(str) {
  var array = str.split('');
  var result = '';
//var counter; (hoisted)
  for (var x = 0; x < array.length; x++) {  
    var counter = 0;
//  ^^^
    for (var y = 0; y < array.length; y++) {
      if (array[x] === array[y]) counter = counter + 1;
    }
    if (counter < 2) {
      result = array[x];
      break;
    }
  }
  return result;  
}

但是,由于var的作用域始终限定为函数,因此将var声明放置在何处并不重要。尽管变量在外循环的每个回合开始时都用0(重新)初始化确实很重要。

由于内部循环,计数器的值在开始子 for(第二个)的过程之前被分配给 0。请注意,中断情况取决于您的计数器值。

如果 array.length = 5 且元素:{1,2,1,3,4} 则

counter   x    y
0         0    0  (initial) 
0         0    0  (if array[0] == array[0]) counter++
1         0    1  (if array[0] == array[1]) nothinghappens
1         0    2  (if array[0] == array[2]) counter++
2         0    3  (if array[0] == array[3]) nothinghappens
2         0    4  (if array[0] == array[4]) nothinghappens

计数器<2 => 否 所以增加 X,设置计数器 0 并再次循环!

counter   x    y
0         1    0  (initial-2) 
0         1    0  (initial-2) if (array[1] = array[0]) nothinghappens
0         1    1  (initial-2) if (array[1] = array[1]) counter++
1         1    2  (initial-2) if (array[1] = array[2]) nothinghappens
0         1    3  (initial-2) if (array[1] = array[3]) nothinghappens
0         1    4  (initial-2) if (array[1] = array[4]) nothinghappens

这里计数器<2,所以结果 = 数组[1] = 2;

这就是您的服务器端代码的工作方式。如果在第二个 for 循环开始之前未将计数器设置为 0,我们将无法获得正确的结果,因为在这种情况下计数器值将为 3,并且循环将继续。