我无法理解为什么下面的两个脚本会产生不同的结果。有人可以帮助我理解为什么这两个脚本的方式不同吗?
var str = "this needs to be capped!",
str1 = str.split(""),
strarray = [];
for(var i = 1; i < str.length; i++) {
if(str[i] == " ") {
strarray.push(str[i]);
strarray.push(str[i+1].toUpperCase());
}
else if(strarray[i] == strarray[i-1]) {
strarray.push(str[i]);
}
}
console.log(strarray.join(','))
&#13;
输出:h,i,s,N,e,e,d,s,T,o ,, B,e ,, C,a,p,p,e,d,!
Vs
var str = "this needs to be capped!",
str1 = str.split(""),
strarray = [];
for(var i = 1; i < str.length; i++) {
if(str[i] == " ") {
strarray.push(str[i]);
strarray.push(str[i+1].toUpperCase());
}
else if(strarray[i] == strarray[i+1]) {
strarray.push(str[i]);
}
}
console.log(strarray.join(','))
&#13;
输出:h,i,s ,, N,n,e,e,d,s,T,o,B,e,C,a,p,p,e,d,!
简而言之,这里的区别是小写&#39; n。&#39;
答案 0 :(得分:2)
这种情况正在发生,因为您要将undefined
与undefined
进行比较。
对于第一种情况,这就是发生的事情
i str[i] strarray
_________________________________
1 h [h]
2 i [h,i]
3 s [h,i,s]
4 ' ' [h,i,s,,N]
5 n [h,i,s,,N] //here it is comparing undefined=='N'
//which is false no push in array
.
.
对于第二种情况,这就是发生的事情
i str[i] strarray
_________________________________
1 h [h]
2 i [h,i]
3 s [h,i,s]
4 ' ' [h,i,s,,N]
5 n [h,i,s,,N,n] //here it is comparing undefined==undefined
//which is true so 'n' was push in array
.
.
/*now whenever space encounters it will push 2 element to
strarray(space and next character), and for the next i strarray[i]
will not be undefined while strarray[i+1] will be undefined so for
that i no push into array. */
答案 1 :(得分:1)
您正在比较字符串(不可变)中的位置与您在循环中不断修改的数组中的位置。
在你的第二个循环中,因为你总是“向前看”(strarray[i + 1]
),所以你总是将undefined
与undefined
进行比较,这总是相同的。
在数组中,您push()
元素,因此元素为零索引(而您的i
计数器从1开始。)
这就是为什么,在你添加第一个大写字母之前,索引是后面的一个,但不是之后(你为每个空格字符向数组添加了2个元素)。
这解释了为什么你得到一个额外的“n”(第一个空格后的第一个字母),以及为什么在第一个实例之后没有复制该行为的原因:
(我省略了第一个循环,因为它不起眼)
var str = "this needs to be capped!";
var strarray = [];
for (var i = 1; i < str.length; i++) {
if (str[i] == " ") {
console.log('space', str[i + 1].toUpperCase());
strarray.push(str[i]);
strarray.push(str[i + 1].toUpperCase());
} else {
console.log('i: ', i, ' / str[i]: ', str[i], ' / strarray[i]: ', strarray[i], ' / strarray[i + 1]: ', strarray[i + 1], ' / str.length: ', str.length, ' / strarray.length: ', strarray.length);
if (i > strarray.length) {
console.log('behind');
} else {
console.log('caught up');
}
console.log();
if (strarray[i] == strarray[i + 1]) {
strarray.push(str[i]);
}
}
}
console.log(strarray.join(','));