使用JavaScript判断字符串是否为isogram的代码逻辑问题排查
isogram判断代码故障说明
核心错误点
你的代码的问题出在循环逻辑的返回时机上:
- for循环内的else分支直接执行
return true,导致循环只会校验第一个字符就直接终止,根本不会检查后续字符是否存在重复。比如输入字符串为abcb,第一个字符a的首次和末次出现索引都是0,会直接触发else返回true,但实际上字符串里的b存在重复,结果完全不符合预期。 - 空字符串的判断属于冗余逻辑,就算删掉这段判断,空字符串拆分后的数组长度为0,循环不会执行,直接在循环结束后返回true即可,逻辑完全一致。
修正后的代码
function isIsogram(str){ str = str.toLowerCase(); let text = str.split(""); for (let i = 0; i < text.length; i++) { if ( text.indexOf(text[i]) !== text.lastIndexOf(text[i]) ){ // 只要有一个字符重复,直接返回false return false; } } // 所有字符校验完成都没有重复,再返回true return true; }
优化方案
你还可以用Set去重的特性实现更简洁的写法,不需要手动遍历:
function isIsogram(str){ return new Set(str.toLowerCase()).size === str.length }
内容的提问来源于stack exchange,提问作者Alex Patient
相关产品推荐
相关产品推荐

