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
相关产品推荐
相关产品推荐

