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 &#39;ejs&#39;的解决办法  Laravel API资源类怎么用_Laravel API Resource数据转换  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  如何快速搭建高效WAP手机网站?  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  高端智能建站公司优选:品牌定制与SEO优化一站式服务