如何用 Array 构造函数与字面量创建不同类型的数组

轻强同学_5830

轻强同学_5830

2026-04-04

678人浏览

原创

new Array(5) 创建长度为5的稀疏数组,无实际元素,map/forEach不遍历;要稠密数组需用Array.from({length:5})或fill();字面量[]更安全高效。

如何用 array 构造函数与字面量创建不同类型的数组

Array 构造函数传一个数字参数会创建稀疏数组

直接写 new Array(5) 不是创建包含 5 个 undefined 的数组,而是创建长度为 5、但没有任何实际元素的稀疏数组(sparse array)。它的 length 是 5,但 0 in arr 返回 false,JSON.stringify(arr) 得到 [null,null,null,null,null] —— 注意不是 undefined,序列化时被转成 null。

常见误用场景:想初始化一个 5 元素的空数组用于后续赋值,结果发现 map、forEach 完全不遍历它,因为这些方法跳过稀疏位置。

  • 要得到真正含 5 个 undefined 的数组,用 Array.from({ length: 5 }) 或 Array(5).fill(undefined)
  • new Array(1, 2, 3) 是安全的,此时它等价于字面量 [1, 2, 3],不会产生稀疏问题
  • 传入非整数(如 new Array('3'))会创建单元素数组 ['3'],不是长度为 3 的数组

字面量 [] 总是创建稠密数组,但不能动态控制长度

写 [1, 2, 3] 或 [] 创建的数组一定是稠密的,每个索引位置都存在(哪怕值是 undefined),map、filter 等方法能正常工作。但它无法像 new Array(n) 那样仅靠参数声明长度 —— 你不能写 [...n] 来生成 n 个元素(除非用扩展运算符配合 Array.from)。

  • 想快速生成 [0,1,2,3,4]?用 Array.from({ length: 5 }, (_, i) => i),别用 new Array(5).map((_, i) => i) —— 后者返回空数组
  • 字面量里写 [,,](两个连续逗号)会产生稀疏数组,和 new Array(2) 效果一致,要小心
  • [undefined, undefined] 是稠密的:两个位置都有值(尽管值是 undefined),forEach 会执行两次

Array 构造函数在子类继承中行为不同

如果定义了继承自 Array 的子类(比如 class MyArray extends Array {}),用 new MyArray(3) 创建实例时,内部仍会调用父类逻辑,结果是稀疏数组;但 new MyArray(1, 2, 3) 或 MyArray.of(1, 2, 3) 就能正确构造稠密子类实例。

  • 子类应优先用 MyArray.of() 替代 new MyArray(),避免稀疏陷阱
  • Array.from() 返回的是普通 Array 实例,不是子类实例;若需子类实例,得用 MyArray.from()(前提是子类实现了静态 from 方法或继承了它)
  • ES6+ 中 Array() 作为函数调用(不加 new)等价于 new Array(),行为完全一致

性能与可读性:字面量几乎总是更优选择

除了极少数需要预分配大数组长度(且确定后续会填满)的场景,[] 字面量比 new Array() 更快、更直观、更少歧义。V8 等引擎对字面量有深度优化,而 new Array(n) 在多数情况下反而触发慢路径。

  • 构建空数组?无条件用 []
  • 初始化已知元素?用 [a, b, c],别写 new Array(a, b, c)
  • 需要指定长度并填充默认值?用 Array(n).fill(value),而不是 new Array(n) 后再循环赋值
  • 动态长度 + 动态内容?Array.from({ length: n }, fn) 是最清晰、最可靠的模式

稀疏数组的存在本身就是一个历史包袱,现代代码里主动制造它几乎没有正当理由;一旦出现“数组长度不对”“遍历不到元素”之类问题,先检查是不是误用了单参数 new Array()。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.31

3171

5

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2025.10.31

554

9

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2026.02.12

542

19

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

20

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

0

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

0

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

120

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

60

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

60

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习