new Array() 与 Array.from() 的差异与陷阱

JS 数组初始化的两种方式:空槽(hole) vs undefined。 下面从结果结构、可遍历性、行为差异、使用场景几个维度,系统对比

一、最直观的差异(重点)

js 复制代码
new Array(10)
// [ <10 empty items> ]

Array.from({ length: 10 })
// [ undefined, undefined, ..., undefined ](10 个)

核心区别

  • new Array(10)稀疏数组(holes)
  • Array.from({ length: 10 })密集数组(元素存在,值为 undefined)

二、数组"空槽(hole)" vs undefined

特性 new Array(10) Array.from({ length: 10 })
数组长度 10 10
是否有元素 ❌ 没有(hole) ✅ 有
0 in arr false true
arr[0] undefined undefined
JSON.stringify [null,null,...] [null,null,...]
js 复制代码
const a = new Array(10)
const b = Array.from({ length: 10 })
// 检查0下标
0 in a // false
0 in b // true

⚠️ undefined !== hole

三、遍历 & 高阶函数行为差异(非常重要)

1️⃣ map / forEach / filter

js 复制代码
new Array(3).map(() => 1)
// [ <3 empty items> ]

Array.from({ length: 3 }).map(() => 1)
// [1, 1, 1]

原因

  • 高阶方法会 跳过 hole
  • 不会跳过 undefined

2️⃣ for...of

js 复制代码
for (const x of new Array(3)) {
  console.log(x)
}
// undefined undefined undefined

for (const x of Array.from({ length: 3 })) {
  console.log(x)
}
// undefined undefined undefined

for...of 会遍历 hole(与 map 不同)

3️⃣ for...in

js 复制代码
for (const i in new Array(3)) console.log(i)
// 什么都不输出

for (const i in Array.from({ length: 3 })) console.log(i)
// 0 1 2

四、性能与语义差异

维度 new Array(10) Array.from({ length: 10 })
创建速度 更快 稍慢
内存 更省(无元素) 占用更多
可预测性 ❌ 容易踩坑 ✅ 行为一致
函数式友好

五、典型使用场景

✅ 适合 new Array(10) 的情况

js 复制代码
// 只关心 length
const buffer = new Array(1024)

// 之后立即填充
const arr = new Array(10)
arr.fill(0)

✅ 适合 Array.from({ length: 10 })

js 复制代码
// 需要 map / filter / reduce
const list = Array.from({ length: 10 }, (_, i) => i)

// JSX / Vue 渲染
{Array.from({ length: 5 }).map((_, i) => (
  <Item key={i} />
))}

六、等价但更常见的写法

js 复制代码
Array.from({ length: 10 }, (_, i) => i)

// 等价于
[...Array(10).keys()]

七、总结一句话(面试 / 设计建议)

new Array(n) 创建的是"空槽数组",
Array.from({ length: n }) 创建的是"真实元素数组"。

推荐原则

  • 遍历 / map / 渲染Array.from
  • 只当 占位容器new Array
相关推荐
T___T5 小时前
Vue 3 做 todos , ref 能看懂,computed 终于也懂了
前端·javascript·面试
cindershade5 小时前
JavaScript 事件循环机制详解及项目中的应用
前端·javascript
王霸天5 小时前
🚀 告别“变形”与“留白”:前端可视化大屏适配的终极方案(附源码)
前端·javascript
LYFlied5 小时前
Vue版本演进:Vue3、Vue2.7与Vue2全面对比
前端·javascript·vue.js
踏浪无痕5 小时前
自定义 ClassLoader 动态加载:不重启就能加载新代码?
后端·面试·架构
踏浪无痕5 小时前
别重蹈我们的覆辙:脚本引擎选错的两年代价
后端·面试·架构
TT哇5 小时前
【每日八股】面经常考
java·面试
Warren985 小时前
面试和投简历闲聊
网络·学习·docker·面试·职场和发展·eureka·ansible
测试人社区-千羽5 小时前
Apple自动化测试基础设施(XCTest/XCUITest)面试深度解析
运维·人工智能·测试工具·面试·职场和发展·自动化·开源软件