JavaScript中for of循环正常生效但普通for循环失效的原因
《存在重复元素》普通for循环运行错误排查
两种循环写法结果不一致和JS循环语法本身无关,核心错误是普通for循环中混淆了数组索引和数组元素值。
for...of循环的遍历变量直接拿到数组每一项的元素值:循环中i依次等于nums[0]、nums[1]...nums[nums.length-1],完全匹配“判断元素是否重复”的逻辑,因此可以正常提交通过。- 你写的普通for循环中,变量
i是从0开始逐次递增的数组下标,不是元素值。你全程调用set.has(i)、set.add(i)操作的都是索引,根本没有读取数组里存的实际内容,逻辑完全偏离题目要求,自然会返回错误结果。索引本身是从0开始的连续不重复整数,大部分场景下你的代码会直接遍历到结尾返回false,完全检测不到元素的重复情况。
修正后的普通for循环代码
只需要把操作对象从索引i换成索引对应的元素值nums[i],普通for循环写法一样可以通过所有测试用例:
var containsDuplicate = function(nums) { let set = new Set() for (let i = 0; i < nums.length; i++) { if (!set.has(nums[i])) { set.add(nums[i]) } else { return true } } return false };
错误复现示例:传入测试用例
nums = [5,5]时
错误写法的执行逻辑:i依次为0、1,Set先后存入0、1,遍历结束返回false,和正确结果true完全相悖
正确写法的执行逻辑:先后取到元素值5、5,第一次存入5,第二次检测到5已存在,直接返回true
内容的提问来源于stack exchange,提问作者christopherlog
相关产品推荐
相关产品推荐

