
本文详解因直接推送数组引用导致嵌套结构中数据被意外清空的问题,通过使用扩展运算符创建浅拷贝即可彻底解决。
本文详解因直接推送数组引用导致嵌套结构中数据被意外清空的问题,通过使用扩展运算符创建浅拷贝即可彻底解决。
在 JavaScript 中,数组是引用类型。当你执行 options.args.push(args_arr) 时,实际推入的是对 args_arr 这一内存地址的引用,而非其当前内容的副本。随后调用 args_arr.length = 0 会清空该数组——而所有之前已推入 options.args 的“副本”,其实都指向同一个数组对象,因此全部同步变为空数组 []。这正是你最终看到 options_arr 中每个 args 的第二项均为 [] 的根本原因。
✅ 正确做法是:在每次推送前创建一份独立的副本。推荐使用扩展运算符(Spread Syntax)实现浅拷贝:
options.args.push([...args_arr]); // ✅ 创建新数组,值相同但内存独立
完整修复后的关键代码段如下:
const args_arr = []; const options_arr = []; let text = ""; for (let i = 0; i ' + JSON.stringify(options_arr, null, 2) + '';
⚠️ 注意事项:
-
...args_arr仅做浅拷贝,适用于args_arr元素均为基本类型(如boolean、number、string)的场景——本例完全适用; - 若
args_arr内部包含对象或嵌套数组,需改用structuredClone()(现代环境)或递归深拷贝方案; - 避免使用
options.args.push(args_arr.slice())或Array.from(args_arr),虽可行但扩展运算符更简洁、语义更清晰。
总结:只要涉及多次复用并修改同一数组对象,又需保留历史状态,就必须显式拷贝。一句口诀记住本质——“推引用易覆写,推副本才安心”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











