JavaScript 中 fill([]) 创建嵌套数组时的引用陷阱详解
发布时间 - 2026-01-02 00:00:00 点击率:次使用 `new array(n).fill([])` 创建嵌套数组会导致所有子数组共享同一引用,因此对任一子数组调用 `push()` 会意外修改所有子数组;而直接字面量声明(如 `[[],[],[]]`)或用 `concat()` 等不可变操作可避免该问题。
在 JavaScript 中,数组是引用类型。当你执行:
let resultsB = new Array(4).fill([]);
fill([]) 并非为每个索引创建一个新数组,而是将同一个空数组对象的引用复制到全部 4 个位置。也就是说,resultsB[0] === resultsB[1] === resultsB[2] === resultsB[3] 为 true —— 它们指向内存中的同一个数组实例。
因此,在循环中执行:
resultsB[i].push(sample[i]);
等价于反复向同一个数组追加元素。最终所有索引都指向那个被多次 push 的数组,结果就是每个“子数组”都包含 [0, 1, 2, 3]。
相比之下:
- let resultsA = [[], [], [], []]; 是显式创建 4 个独立数组字面量,彼此引用不同;
- resultsC[i] = resultsC[i].concat(sample[i]); 虽然 resultsC 同样由 fill([]) 构建(共享引用),但 concat() 返回一个全新数组,赋值操作 = 将 resultsC[i] 重新绑定到新数组,从而打破引用共享,实现逻辑隔离。
✅ 正确创建独立嵌套数组的方法(推荐):
// ✅ 方法1:Array.from + 映射函数(最清晰、ES6+ 推荐)
const results = Array.from({ length: 4 }, () => []);
// ✅ 方法2:Array.fill 配合 map(避免直接 fill 引用)
const results = new Array(4).fill(null).map(() => []);
// ✅ 方法3:for 循环手动初始化
const results = [];
for (let i = 0; i < 4; i++) results.push([]);
// ❌ 避免:new Array(4).fill([]) —— 共享引用陷阱⚠️ 注意事项:
- 此问题不仅限于数组:new Array(3).fill({
}) 同样导致对象引用共享; - fill() 本身无错,错在误用它填充可变引用类型;
- 调试时 console.log(resultsB) 看似“正常”,是因为控制台显示的是当前引用状态(最后被 push 完的状态),无法反映初始化时的引用关系 —— 建议用 Object.is(resultsB[0], resultsB[1]) 验证引用一致性。
总结:永远不要用 fill([]) 或 fill({}) 创建多维结构。优先使用 Array.from({ length: n }, () => [...]) 或 map() 构造独立实例,从根本上规避引用污染风险。
# javascript
# es6
# java
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
如何在自有机房高效搭建专业网站?
Python并发异常传播_错误处理解析【教程】
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
昵图网官方站入口 昵图网素材图库官网入口
晋江文学城电脑版官网 晋江文学城网页版直接进入
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
JS弹性运动实现方法分析
如何用AI帮你把自己的生活经历写成一个有趣的故事?
Laravel如何记录自定义日志?(Log频道配置)
Android Socket接口实现即时通讯实例代码
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
大同网页,大同瑞慈医院官网?
制作公司内部网站有哪些,内网如何建网站?
千库网官网入口推荐 千库网设计创意平台入口
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
简单实现Android文件上传
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
潮流网站制作头像软件下载,适合母子的网名有哪些?
bootstrap日历插件datetimepicker使用方法
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
教你用AI润色文章,让你的文字表达更专业
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
android nfc常用标签读取总结
如何在服务器上配置二级域名建站?
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
桂林网站制作公司有哪些,桂林马拉松怎么报名?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
如何在宝塔面板中创建新站点?
简单实现jsp分页
JS去除重复并统计数量的实现方法
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
Laravel如何使用.env文件管理环境变量?(最佳实践)
教你用AI将一段旋律扩展成一首完整的曲子
node.js报错:Cannot find module 'ejs'的解决办法
Laravel API资源类怎么用_Laravel API Resource数据转换
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
如何快速搭建高效WAP手机网站?
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
高端智能建站公司优选:品牌定制与SEO优化一站式服务


}) 同样导致对象引用共享;