js问题,对乱码中的英文单词进行计数?

alert(countOfWorld("world,8thanks*0you>like0000)))what"))
            function countOfWorld(str){
                  var count = 0;
                  for(i = 0; i < str.length - 1; i++){
                        if(isABC(str[i]) && !isABC(str[i + 1])){
                              count++;
                        }
                  }
                  return count;
            }


            function isABC(scc){
                  if(scc >= "a" && scc <= "z" || scc >= "A" & scc <= "Z"){
                        return true;
                  }else
                        return false;
            }

这串代码的逻辑是第一个字母是单词,第二个字母不是单词,但是最后一个单词后面没有非字母了,所以无法判断,所以怎样优化代码可以把最后一个单词也数进去?

如果你只是单纯的想要得到英文字符串的个数的话,只要将for循环中str.length - 1改为str.length就好。

在你的源码中通过isABC(str[i]) && !isABC(str[i + 1])和scc >= "a" && scc <= "z" || scc >= "A" & scc <= "Z"去判断当前字符和下一个字符是否为字母,如果当前字符为字母而下一个字符不是字母,则表示一个单词,实现count++。

但是因为你的循环遍历区间为0-str.length - 1,那么就说明你的当前字符串只可以遍历到what里的a就停止了,导致无法完全将字符串完全遍历,当遍历到a时你会判定a是一个字母,后面str[i + 1]会遍历到t,同样t也是一个字母,那么你的siABC函数会在a和t都返回true,isABC(str[i]) && !isABC(str[i + 1])后者加了!(非)变成了true&&false,count++无法执行,最后等于4。

当将循环区间改为0-str.length时,最后一个遍历的字母是t,在执行str[i + 1]你是得不到任何字符的,因为你的字符串已经遍历完了,那么isABC(str[i + 1]实际上就传了一个undefined过去,最后返回一个false,执行isABC(str[i]) && !isABC(str[i + 1])是就变成了true&&!false也就是true&&true,count++会执行,最终count为5.

这样的方式虽然可以可以得到最后的答案,但是明显存在bug,因为出现了undefined。

更好的方式为用正则表达式去解决,获取字符串中的单词。

https://www.npmjs.com/package/find-english-words  看看这个 能用么?

 

var arr = 'world,8thanks*0you>like0000)))what'
    var reg = /([A-Za-z]+)/g
    var num = 0
    arr.replace(reg,(len,value,where) => {
        console.log(len,value,where);
        ++num;
    })
    console.log(num);