You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:46:13