单词查找器故障排查:do-while循环及exec()函数问题
问题分析与解决方案
你的代码问题出在全局正则的exec()使用逻辑和do-while循环的结构上,具体问题和修复方案如下:
核心问题
- 仅执行一次
exec():你只在循环开始前调用了一次w.exec(),之后没有再次调用获取下一个匹配项。如果第一次匹配成功,yes会一直为true,导致无限循环;如果第一次没匹配到,直接退出循环,逻辑完全失效。 - 全局正则的
lastIndex特性:带g标志的正则会维护lastIndex属性,每次调用exec()会从这个位置开始查找下一个匹配,你没有利用这个特性来遍历所有匹配项。
修复后的代码
方案1:用while循环(更直观)
const words = [/lorem/gi, /ipsum/gi]; // 提前转换body内容为字符串,避免重复操作 const bodyText = String(document.body.innerHTML); let log = []; for (const regex of words) { let match; // 每次调用exec()更新match,直到返回null while ((match = regex.exec(bodyText)) !== null) { log.push(match); } } console.log(log);
方案2:保留do-while结构
如果你坚持使用do-while,可以调整逻辑如下:
const words = [/lorem/gi, /ipsum/gi]; const bodyText = String(document.body.innerHTML); let log = []; for (const regex of words) { let match = regex.exec(bodyText); do { if (match) { log.push(match); // 每次处理完当前匹配,调用exec()获取下一个结果 match = regex.exec(bodyText); } } while (match !== null); } console.log(log);
关键说明
- 提前将
document.body.innerHTML转为字符串并缓存,避免每次exec()都重复转换DOM内容,提升性能。 - 全局正则的
exec()必须被多次调用,才能遍历所有匹配项,每次调用会自动更新lastIndex,直到返回null表示没有更多匹配。 - 去掉了冗余的
yes变量和自定义标签loo,简化逻辑的同时避免循环控制错误。
内容的提问来源于stack exchange,提问作者Mohammad Maaz
相关产品推荐
相关产品推荐

