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

TypeScript中Array.map返回[empty × N]空项数组问题

问题产生原因

这个问题是JavaScript数组固有特性叠加TypeScript低版本编译逻辑共同导致的:

  1. 通过new Array(n)创建的是稀疏数组:这类数组仅会将length属性设置为传入的数值n,所有索引位置都没有实际存储值,标记为empty空槽,和值为undefined的真实元素有本质区别。
  2. Array.prototype.map 的遍历规则是直接跳过所有空槽,不会对空槽执行传入的回调函数,空槽会被原样保留在返回结果中。

你代码中写的[...new Array(days)]扩展运算符,在原生ES2015及以上环境中本来会把空槽转换为值为undefined的真实元素,让map可以正常执行回调。但如果你的TypeScript配置里compilerOptions.target设置为ES5或更低版本,扩展运算符会被转译为兼容旧环境的数组拷贝逻辑(基于slice、普通for循环的实现),这类转译逻辑不会特殊处理稀疏数组的空槽,会把空槽原样复制到新数组中,最终map完全不执行回调,就得到了你看到的[empty × 31]结果。

修复方案

推荐两种不受编译目标影响、兼容性稳定的写法,都可以正确生成从1开始递增的日期序号数组:

  • 方案1:使用Array.from,它会自动遍历所有索引位,把空槽转换为真实元素,还支持直接传入map回调作为第二个参数,写法最简洁:
function getDaysArray(days: number): number[] {
  return Array.from({ length: days }, (_, i) => i + 1);
}
  • 方案2:创建数组后先用fill填充任意占位值,把所有空槽替换为真实元素,再调用map遍历:
function getDaysArray(days: number): number[] {
  return new Array(days).fill(0).map((_, i) => i + 1);
}

内容的提问来源于stack exchange,提问作者Tian kline

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:45:29