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
相关推荐
左夕26 分钟前
分不清apply,bind,call?看这篇文章就够了
前端·javascript
滕青山1 小时前
文本行过滤/筛选 在线工具核心JS实现
前端·javascript·vue.js
时光不负努力1 小时前
编程常用模式集合
前端·javascript·typescript
大雨还洅下1 小时前
前端JS: 跨域解决
javascript
OpenTiny社区1 小时前
OpenTiny NEXT-SDK 重磅发布:四步把你的前端应用变成智能应用
前端·javascript·ai编程
梦想CAD控件2 小时前
在线CAD开发包结构与功能说明
前端·javascript·vue.js
时光不负努力2 小时前
TS 常用工具类型
前端·javascript·typescript
SuperEugene2 小时前
Vue状态管理扫盲篇:Vuex 到 Pinia | 为什么大家都在迁移?核心用法对比
前端·vue.js·面试
Hilaku2 小时前
我会如何考核一个在简历里大谈 AI 提效的高级前端?
前端·javascript·面试
进击的尘埃2 小时前
Vue3 中 emit 能 await 吗?事件机制里的异步陷阱
javascript