最高效的方法是使用 array.from() 或 array(n).fill():基本类型默认值用 fill(),引用类型默认值或需索引计算时用 array.from();二者均为 es6+ 特性,旧环境需谨慎兼容。

最高效的方法是使用 Array.from() 或 Array(n).fill(),具体选哪个取决于默认值是否为基本类型或需独立引用的对象。
基本类型默认值:用 Array(n).fill(value)
当默认值是数字、字符串、布尔值等基本类型时,fill() 简洁且性能好。它直接在已创建的稀疏数组上批量赋值,避免循环。
-
Array(5).fill(0)→[0, 0, 0, 0, 0] -
Array(3).fill("hello")→["hello", "hello", "hello"] - 注意:
Array(5)创建的是长度为 5 的空位(empty slots)数组,fill()会填充所有索引位置,不跳过空位
对象或数组默认值:用 Array.from({ length: n }, () => ({}) )
若默认值是对象、数组等引用类型,必须用 Array.from() 配合映射函数,否则 fill() 会导致所有元素引用同一对象,修改一处影响全部。
-
Array(3).fill([])❌ 所有元素指向同一个数组 -
Array.from({ length: 3 }, () => [])✅ 每个元素是独立新数组 -
Array.from({ length: 4 }, () => ({ id: 0, name: "" }))→ 创建 4 个独立对象
需要带索引计算的默认值:仍用 Array.from()
如果每个元素的值依赖于其索引(如递增编号、坐标计算),Array.from 的回调函数天然支持第二个参数 index。
-
Array.from({ length: 5 }, (_, i) => i * 2)→[0, 2, 4, 6, 8] -
Array.from({ length: 3 }, (_, i) => `item-${i + 1}`)→["item-1", "item-2", "item-3"]
兼容性与替代写法
Array.from 和 fill 均为 ES6+ 特性,现代浏览器和 Node.js 环境普遍支持。若需支持旧环境(如 IE),可用 Array(n).join().split(',').map(() => value),但效率低、可读性差,不推荐。
不建议用 new Array(n).map(() => value) —— 因为 new Array(n) 创建的是稀疏数组,map 会跳过空位,结果全是 undefined。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











