Math.min.apply处理长度100数组返回NaN,索引格式引发异常排查
为什么字符串格式的索引会导致Math.min.apply返回NaN?
这是个典型的JavaScript数组与对象特性混淆的问题,咱们一步步拆解原因:
1. JavaScript数组的「索引」本质
JavaScript里的数组其实是特殊的对象,它的「索引」本质是对象属性名,但只有符合特定规则的属性名才会被视为「数组索引」:
- 必须是可转换为非负整数的字符串,且转换为数字后再转回字符串,要和原字符串完全一致。比如
"0"转数字是0,转回字符串还是"0",符合规则;但"00"转数字是0,转回字符串是"0",和原字符串"00"不一致,所以它只是普通的对象属性,不属于数组的元素。
2. Math.min.apply的工作逻辑
当你调用 Math.min.apply(Math, array) 时:
- apply会把传入的
array当作类数组对象处理:先读取array的length属性,再遍历从0到length-1的数字索引,收集这些索引对应的元素作为Math.min的参数。 - 如果数组是用
"00""01"这类字符串索引生成的,这些索引不属于合法数组索引,所以数组的length不会被正确设置(或者说0到99这些数字索引对应的元素全是undefined)。此时Math.min收到的参数全是undefined,而undefined在数学运算中会被转为NaN,Math.min只要遇到NaN就会返回NaN。
3. 为什么长度为10时能正常运行?
推测你在数组长度为10时,用的字符串索引是"0"到"9"——这些字符串符合数组索引规则(转数字再转回字符串和原字符串一致),所以会被当作数组的合法索引,数组的length会自动设为10,0到9的索引对应的元素都有值,Math.min.apply就能正常收集所有元素并计算最小值。
结合你的代码验证
看你的getAllIndexes方法,它用arr.indexOf(val)查找元素——indexOf只会遍历数组的合法数字索引对应的元素,根本不会处理"00"这类普通对象属性,所以当你用字符串索引时,indexOf找不到对应值,最终indexes数组是空的,这也侧面印证了这些字符串索引的属性不属于数组元素。
内容的提问来源于stack exchange,提问作者Emmanuel Garcia Martinez
相关产品推荐
相关产品推荐

