讲师中心 微信公众号
AI工具推荐 视频效率加速

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

轻强同学_5830

轻强同学_5830

发布时间:2026-04-04 22:33:15

|

678人浏览过

|

来源于php中文网

原创

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()。

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

热门AI工具

更多
AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

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

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

3171

2023.10.31

php数据类型
php数据类型

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

554

2025.10.31

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

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

542

2026.02.12

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

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

40

2026.10.28

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

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

20

2026.10.28

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

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

0

2026.10.28

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

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

120

2026.10.22

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

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

80

2026.10.22

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

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

60

2026.10.22

热门下载

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

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn