求修复:统计字符串中不含//与/*注释的字符数的JavaScript函数
修复多行注释字符统计问题的方案
我先帮你梳理下原代码里的几个核心问题:
countStars变量在if块内用var声明,导致作用域混乱,初始状态也没正确设置- 多行注释的处理逻辑顺序颠倒了,应该先检查是否处于多行注释中,再处理当前行的内容
- 没有处理**同一行内同时存在
/*和*/**的情况,也没考虑多行注释跨行的场景
下面是修复后的完整代码,我会逐点解释修改的地方:
function findComments() { var string = document.getElementById("input").value; var splittedString = string.split("\n"); var count = 0; var countStars = false; // 把状态变量提到函数开头,初始化false for (var i = 0; i < splittedString.length; i++) { var currentLine = splittedString[i]; var processedLine = currentLine; // 第一步:处理多行注释状态 if (countStars) { // 寻找当前行的*/位置 var endMultiCommentIndex = processedLine.indexOf("*/"); if (endMultiCommentIndex > -1) { // 找到结束标记,只保留*/之后的内容 processedLine = processedLine.slice(endMultiCommentIndex + 2); countStars = false; } else { // 没找到结束标记,整行跳过 continue; } } // 第二步:检查当前行是否有新的多行注释开始 var startMultiCommentIndex = processedLine.indexOf("/*"); while (startMultiCommentIndex > -1) { // 先统计/*之前的字符 count += processedLine.slice(0, startMultiCommentIndex).length; // 寻找当前段的*/位置 var endMultiCommentIndex = processedLine.indexOf("*/", startMultiCommentIndex + 2); if (endMultiCommentIndex > -1) { // 找到结束标记,保留*/之后的内容继续处理 processedLine = processedLine.slice(endMultiCommentIndex + 2); startMultiCommentIndex = processedLine.indexOf("/*"); } else { // 没找到结束标记,进入多行注释状态,结束当前行处理 countStars = true; processedLine = ""; break; } } // 第三步:处理单行注释 var singleCommentIndex = processedLine.indexOf("//"); if (singleCommentIndex > -1) { processedLine = processedLine.slice(0, singleCommentIndex); } // 统计有效字符 count += processedLine.length; } console.log(count); }
关键修改说明:
- 状态变量作用域修正:把
countStars移到函数开头声明并初始化,确保在整个循环中状态是持续的,不会因为块级声明导致重置 - 多行注释处理逻辑重构:
- 先判断是否处于多行注释中,找到结束标记后才继续处理后续内容
- 支持处理同一行内多个
/*/*/的嵌套或连续情况(比如/* 注释1 */ 有效内容 /* 注释2 */)
- 字符统计逻辑优化:不再直接统计整行,而是逐步截断注释部分,只统计有效内容的长度
- 跨行多行注释支持:当遇到未闭合的
/*时,标记状态为true,后续行都会跳过直到找到*/
这个版本可以正确处理:
- 单行注释
//之后的内容不统计 - 多行注释
/* ... */内的内容不统计,包括跨行的情况 - 同一行内同时存在多行注释、单行注释和有效内容的混合场景
内容的提问来源于stack exchange,提问作者ITGuru
相关产品推荐
相关产品推荐

