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);