我是初学者,所以我正在解决一个练习,它是一个函数,用于返回字符串中第一个未重复的字母,我的答案根本不起作用,所以当我查看解决方案时,我发现它类似于我的答案表在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;
}
答案 0 :(得分:1)
重新分配甚至没有改变变量的值。
是的。
请注意,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
声明的位置并不重要。尽管在外循环的每一圈开始时变量都是用{{1}}进行(重新)初始化,但这很重要。
答案 1 :(得分:1)
由于内部循环,在开始sub-for(第二个)的过程之前,counter的值被赋值为0。请注意,中断情况取决于您的计数器值。
如果array.length = 5,则元素为:{1,2,1,3,4},然后
save('TtDataBase.mat','description','description2','-append')
计数器&lt; 2 =&gt;否则增加X,设置计数器0并再次循环!
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
这里的柜台&lt; 2,所以result = array [1] = 2;
这就是您的服务器端代码的工作方式。如果在开始第二个for循环之前没有将counter设置为0,我们将无法得到正确的结果,因为在这种情况下计数器值将为3并且循环将继续...