JavaScript中for...in输出与forEach、普通for循环不一致原因求解
问题核心原因
for...in 语句的设计作用是遍历对象的可枚举属性名,而非数组的元素值,你遇到的输出差异完全是用法错误导致的,和for...in本身的BUG无关。
你示例中map['1']的值是数组['1'],数组在JS中本质上是特殊的对象:数组的数字下标就是其属性名,类型为字符串。这个长度为1的数组只有一个下标0,对应存储的元素值是'1'。
三个遍历方法的逻辑差异如下:
- 方法1的
for(let val in map['1']),遍历拿到的val是数组的属性名'0',你直接打印属性名自然输出0;如果要拿到对应元素值,需要写console.log(map['1'][val])才能输出1。 - 方法2的
forEach回调的第一个入参就是数组当前遍历的元素值,所以直接打印得到1。 - 方法3的普通for循环是手动通过下标
i读取数组对应位置的元素值,所以打印得到1。
使用注意事项
- 永远不要用
for...in遍历数组,除了拿到的是属性名而非值之外,它还会遍历原型链上的所有可枚举属性,如果你给Array.prototype扩展了自定义方法/属性,这些内容也会被for...in遍历出来,引发不可预期的问题。 - 如果需要遍历数组拿元素值,优先选择
for...of语句,你将方法1改为for(let val of map['1'])即可输出预期的1,同时支持break/return中断遍历。
内容的提问来源于stack exchange,提问作者Mad-D
相关产品推荐
相关产品推荐

