LeetCode 2634:数组过滤代码中Number()的作用疑问
为什么这段数组过滤代码必须用Number()转换索引?
核心原因很简单:用for...in遍历数组时,拿到的索引i是字符串类型,不是你以为的数字。
数组本质是特殊的对象,它的索引(0、1、2这些)在对象层面是字符串形式的键名。你可以在循环里加一句console.log(typeof i)验证,输出肯定是string,而不是number。
举个实际场景,假设你传入的过滤函数fn是这样的:
function keepItem(item, index) { // 期望索引是数字,判断是否等于1 return index === 1; }
如果不用Number(i),传给index的是字符串"1",此时"1" === 1的结果是false,对应元素根本不会被加入过滤数组;而用Number(i)把字符串转成数字1后,判断逻辑才会正常生效。
很多时候我们写的过滤逻辑(包括数组内置的filter方法回调)都期望索引是数字类型,所以必须通过Number()把for...in拿到的字符串索引转换成数字,否则就会因为类型不匹配导致逻辑失效。
另外提一句:遍历数组尽量别用for...in,它本来是为遍历普通对象设计的,可能会遍历到数组原型上的额外属性,推荐用for...of、普通for循环,或者直接用Array.filter方法更安全。
内容的提问来源于stack exchange,提问作者Marcus Pereira
相关产品推荐
相关产品推荐

