JavaScript中factorChain函数为何使用!==正常但===失效
异常原因拆解
你观察到的运行差异和!==、===的运算符特性没有直接关系,根本问题是修改代码时把判断逻辑、返回触发时机、兜底返回值的方向全部调整反了。
第一段代码的运行逻辑
这段函数的目标是校验数组是否为合格的因子链——即数组内每一对相邻元素,后一个值必须能被前一个值整除,没有任何例外:
- 循环遍历所有相邻元素对,只要发现某一对的取模结果不等于0(也就是两数除不尽),立刻返回
false,判定数组不符合要求 - 等所有相邻元素对遍历完成、没有出现除不尽的情况,最终返回
true
代入测试用例[2, 4, 6, 7, 12]的执行流程:
当循环到第三组相邻元素7和12时,计算得到12 % 7 = 5,结果不等于0,直接返回false,和预期结果一致。
补充:原代码存在一个未触发的边界隐患:循环终止条件写的是i < arr.length,遍历到数组最后一位时,会访问数组边界外的arr[i+1],也就是undefined,计算undefined % 数值会得到NaN,后续比较会直接触发返回false。只是当前测试用例在走到越界逻辑前就已经触发了返回,才没有暴露问题。正确的循环终止条件应该写为i < arr.length - 1。
第二段代码运行异常的核心错误
你修改后的代码叠加了三处和目标要求完全相反的逻辑问题,并非===本身导致程序失效:
- 判断触发规则颠倒:原逻辑是“发现除不尽就返回失败”,你改成了“发现任意一组除得尽就返回成功”
- 返回时机颠倒:原逻辑是遍历完全部元素、确认所有相邻对都符合要求才返回结果,你改成了“碰到第一组能除尽的相邻对,就立刻返回成功”
- 兜底返回值颠倒:原逻辑是全部校验通过返回成功,你改成了“全部遍历完都没碰到能除尽的相邻对,才返回失败”
还是代入测试用例走修改后的代码流程:
第一次循环就访问第一组相邻元素2和4,计算得到4 % 2 = 0,立刻触发if(0 === 0)的判断,直接返回true——完全不会遍历检查后面6、7、12这些不符合因子链要求的相邻对,输出结果自然和预期不符。
用===实现正确功能的参考写法
只要逻辑和返回时机匹配函数目标,用===完全可以正常运行:
function factorChain(arr) { // 修正边界越界问题,仅遍历到数组倒数第二位 for(let i = 0; i < arr.length - 1; i++){ // 余数为0说明当前相邻对符合要求,直接进入下一轮循环 if(arr[i+1] % arr[i] === 0) { continue } // 执行到这里说明余数不为0,相邻对不符合要求 return false } // 所有相邻对校验完成,全部符合要求 return true }
这个版本全程使用===做比较判断,运行结果和第一段原代码完全一致,也能正确处理边界场景。
内容的提问来源于stack exchange,提问作者DotN
相关产品推荐
相关产品推荐

