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
相关推荐
天若有情6732 小时前
程序员原创|借鉴JS事件冒泡,根治电脑文件混乱的“冒泡整理法”
开发语言·javascript·windows·ecmascript·电脑·办公·日常
FYKJ_20103 小时前
springboot校园兼职平台--附源码02041
java·javascript·spring boot·python·eclipse·django·php
AI人工智能+电脑小能手5 小时前
【大白话说Java面试题】【Java基础篇】第30题:JDK动态代理和CGLIB动态代理有什么区别
java·开发语言·后端·面试·代理模式
头发够用的程序员6 小时前
C++和Python面试经典算法汇总(一)
开发语言·c++·python·算法·容器·面试
云泽8088 小时前
二叉树高阶笔试算法题精讲(二):非递归遍历与序列构造全解析
c++·算法·面试
Cosolar8 小时前
大型语言模型(LLM)微调与量化技术全指南——从预训练到高效部署
人工智能·后端·面试
空中海8 小时前
01 React Native 基础、核心组件与布局体系
javascript·react native·react.js
沪漂阿龙8 小时前
深度硬核!2026年NLP面试最全指南:从Word2Vec到Transformer,大模型时代算法工程师通关秘籍
自然语言处理·面试·word2vec
前端之虎陈随易10 小时前
2年没用Nodejs了,Bun很香
linux·前端·javascript·vue.js·typescript
好运的阿财12 小时前
OpenClaw工具拆解之host_workspace_write+host_workspace_edit
前端·javascript·人工智能·机器学习·ai编程·openclaw·openclaw工具