假设循环从i = 1开始,isn&#t; t = = [i-1]和i == [i + 1]相同吗?

时间:2018-03-06 19:51:55

标签: javascript

我无法理解为什么下面的两个脚本会产生不同的结果。有人可以帮助我理解为什么这两个脚本的方式不同吗?



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;
&#13;
&#13;

输出:h,i,s,N,e,e,d,s,T,o ,, B,e ,, C,a,p,p,e,d,!

Vs

&#13;
&#13;
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;
&#13;
&#13;

输出:h,i,s ,, N,n,e,e,d,s,T,o,B,e,C,a,p,p,e,d,!

简而言之,这里的区别是小写&#39; n。&#39;

2 个答案:

答案 0 :(得分:2)

这种情况正在发生,因为您要将undefinedundefined进行比较。

对于第一种情况,这就是发生的事情

    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]),所以你总是将undefinedundefined进行比较,这总是相同的。

在数组中,您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(','));