You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript数组是否共享内存?Minecraft JS接口中的疑问

为什么两个例子里xList的结果不一样?

这本质是JavaScript里引用类型的赋值规则导致的,数组属于引用类型,变量里存的不是数组本身,而是指向内存中数组对象的"地址"。

例子1的逻辑:

// example 1
xList = [1, 2, 3, 4, 5];
xList.length = 0;
yList = ["a", "b", "c"];
xList = yList; // 关键:xList和yList现在指向同一个数组对象
yList.length = 0; // 修改的是这个共享的数组,xList自然也跟着变
// 结果:xList.length = 0,xList = []

这里xList = yList是把yList的引用(也就是数组的内存地址)赋值给xList,相当于两个变量"共用"同一个数组。之后修改yList指向的数组(改length清空),xList因为指向同一个数组,所以结果也会变空。

例子2的逻辑:

// example 2
xList = [1, 2, 3, 4, 5];
xList.length = 0;
yList = ["a", "b", "c"];
xList = yList; // 一开始xList和yList指向同一个数组
yList = ["a", "xx", "c"]; // 关键:给yList重新赋值了一个全新的数组
yList.length = 0; // 修改的是新数组,和xList没关系
// 结果:xList.length = 3,xList = ["a", "b", "c"]

这里yList = ["a", "xx", "c"]这一步是创建了一个新的数组对象,然后把这个新数组的引用赋值给yList。这时候yList的引用已经和xList的引用分道扬镳了——xList还指着原来的["a","b","c"],yList指着新数组。之后清空yList的新数组,自然不会影响xList指向的旧数组。

怎么主动解除关联?

如果想让xList和yList彻底没关系,不用重新赋值yList的话,可以给xList赋值一个原数组的拷贝,比如:

xList = [...yList]; // 扩展运算符拷贝
// 或者
xList = yList.slice(); // slice方法拷贝
// 或者
xList = Array.from(yList);

这样xList拿到的是一个全新的数组对象,后续修改yList的原数组,xList的内容不会跟着变。

内容的提问来源于stack exchange,提问作者TAP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 22:05:07