JavaScript while循环校验成员名存在性时无限循环问题
问题根因
代码存在3个直接触发死循环的核心错误:
indexOf方法调用方式错误
数组的indexOf仅接收2个参数:第一个为待查找的目标元素,第二个为可选的查找起始位置。你一次性传入5个姓名字符串,方法只会取第一个参数"Leonardo"作为查找目标,剩余4个姓名参数会被直接丢弃,根本不会参与匹配校验。- 判断条件存在运算符优先级问题
现有条件memberName == subMemberGroup.indexOf(...) !== -1属于连续比较,JS会从左到右分步执行:第一步:计算
memberName == 下标返回值,得到布尔结果true或false
第二步:计算布尔值 !== -1,JS中布尔值转数字时true对应1、false对应0,两个值都不等于-1,因此整个if判断永远为true,无论输入什么内容都会进入重输提示分支,永远无法触发else的break逻辑。 - 变量声明位置问题
你用var声明memberName的位置在if分支内部,var存在变量提升特性,第一次进入循环做判断时,memberName的实际值是undefined,初始判断从一开始就不符合预期。
修复代码
推荐用语义更清晰的includes()方法做存在性判断,从写法上避免优先级错误,修正后逻辑如下:
// 如果你要校验的固定重名列表就是这5个名字,先单独定义 const existNames = ["Leonardo", "Catherine", "Luther", "Bruce", "Amy"]; // 提前获取第一次输入,避免初始值为undefined let memberName = input.question("Please enter member's name: "); while (existNames.includes(memberName)) { console.log("\nMember's name exists in database. Please enter a new name."); memberName = input.question("Please enter member's name: "); } // 循环退出后即可拿到不重名的memberName,执行后续业务逻辑
如果你的subMemberGroup本身就是存储全量已存在成员的数组,不需要额外定义existNames,直接把判断条件换成subMemberGroup.includes(memberName)即可。
如果要坚持用indexOf实现,正确的判断写法为subMemberGroup.indexOf(memberName) !== -1,注意是把用户输入的memberName作为参数传入indexOf,不要把待匹配的姓名列表当参数传进去。
内容的提问来源于stack exchange,提问作者user17166745
相关产品推荐
相关产品推荐

