TypeScript中Array.map返回[empty × N]空项数组问题
问题产生原因
这个问题是JavaScript数组固有特性叠加TypeScript低版本编译逻辑共同导致的:
- 通过
new Array(n)创建的是稀疏数组:这类数组仅会将length属性设置为传入的数值n,所有索引位置都没有实际存储值,标记为empty空槽,和值为undefined的真实元素有本质区别。 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
相关产品推荐
相关产品推荐

