JavaScript基础单词计数器(基于空格计数)返回结果异常求助
问题排查与修复:JavaScript单词计数器返回错误结果
嘿,我一眼就发现你代码里的问题啦!导致countWords("hello World")返回1而非2的核心原因是for循环中的变量i没有初始化。
问题分析
看这段代码里的循环部分:
for (var i; i < str.length; i++) { ... }
你只声明了var i但没给它赋值,这时候i的初始值是undefined。当用undefined和字符串长度(比如"hello World"的长度是11)做比较时,undefined < 11会被判定为false,循环体根本不会执行!所以counter一直保持初始值1,自然得不到正确的结果。
修复方案
只需要给i初始化赋值为0,让循环从字符串的第一个字符(索引0)开始遍历:
function countWords(str) { if (typeof str == "string" && str.length > 0) { var counter = 1; // 给i初始化赋值为0,让循环正常启动 for (var i = 0; i < str.length; i++) { if (str[i] === " ") { counter += 1; } } return counter; } else { throw Error("You must input a string."); } }
现在调用console.log(countWords("hello World"))就会返回预期的2啦!
额外优化建议(可选)
你的当前实现还有一些边界场景没考虑到,比如:
- 字符串开头/结尾有空格:比如
countWords(" hello World ")会返回3(首尾空格会被错误计数) - 连续多个空格:比如
countWords("hello World")会返回4(多个连续空格会被重复计数)
如果要处理这些情况,可以在循环前先去除字符串首尾的空格,并且只在遇到空格且前一个字符不是空格时才计数:
function countWords(str) { if (typeof str !== "string") { throw Error("You must input a string."); } // 去除首尾空格,处理空字符串场景 const trimmedStr = str.trim(); if (trimmedStr.length === 0) { return 0; } let counter = 1; for (let i = 0; i < trimmedStr.length; i++) { // 仅当当前是空格且前一个字符不是空格时,才增加计数 if (trimmedStr[i] === " " && trimmedStr[i-1] !== " ") { counter += 1; } } return counter; }
这个版本能更准确地统计单词数量,比如空字符串返回0、多空格场景也能得到正确结果。
内容的提问来源于stack exchange,提问作者Alex G. Borrego
相关产品推荐
相关产品推荐

