JS数组统计特定值时返回2却判定为false的问题及修复
问题原因与修复方案
核心问题:未声明循环变量导致全局变量污染
你的代码里存在**未使用let/const声明循环变量i**的问题,这会导致i成为全局变量,在多个循环间互相干扰:
- 首次进入
for (i in cards)循环时,i被赋值为字符串"0"。 - 调用
count(sortedranks, i)时,函数内部的for (i of array)没有声明i,直接复用全局的i。这个循环会把i依次覆盖为数字0、0、1、1、2,循环结束后全局i的值固定为数字2。 - 当执行
count(sortedranks, i) === 2时,这里的i已经变成了数字2,而非最初的字符串"0"。此时count(sortedranks, 2)返回1,1 === 2自然为false。
另外,for...in遍历数组得到的是字符串类型的索引,而sortedranks里的元素是数字,==的隐式类型转换也会带来潜在的逻辑模糊性。
修复代码
给所有循环变量添加const/let声明,隔离变量作用域即可解决问题:
const cards = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "jack", "queen", "king", "ace"]; let sortedranks = [0, 0, 1, 1, 2]; function count(array, value) { let cnt = 0; // 用const声明循环变量,避免污染全局 for (const i of array) { if (i == value) cnt++; } return cnt; } // 同样用const声明迭代变量 for (const i in cards) { console.log(sortedranks); console.log(i); const countResult = count(sortedranks, i); console.log(countResult); console.log(countResult === 2); }
修复后首次迭代的输出会变为:
[0, 0, 1, 1, 2] 0 2 true
如果想进一步避免隐式类型转换的风险,可以在调用count时把i转为数字,同时将count函数内的==改为===:
// 修改count调用 const countResult = count(sortedranks, Number(i)); // 修改count函数内的判断 if (i === value) cnt++;
内容的提问来源于stack exchange,提问作者Sirox0
相关产品推荐
相关产品推荐

