今天工作时碰到一个需求,有两个数组arrayChild, arrayFather, 要求:
1、往数组arrayChild中放入一个元素;
2、将当前的数组arrayChild放入arrayFather中;
3、清空数组arrayChild,将一个新元素放进去;
4、将放了新元素的arrayChild放入数组arrayFather中。
刚开始是这么写的:
const arrayChild = [];
const arrayFather = [];
arrayChild.push(0, 1);
arrayFather.push(arrayChild);
arrayChild.splice(0);
arrayChild.push(3, 4);
arrayFather.push(arrayChild);
console.log(`arrayFather = ${arrayFather}`);
预想结果是:
arrayFather = [[0, 1], [3, 4]];
实际结果:
arrayFather = [[3, 4], [3, 4]];
为什么呢?向公司老司机请教,才知道原来创建一个数组时,会在内存中开辟一块地址A,我的arrayChild只是指向了那片地址,所以使用const声明的数组,还可以继续向数组内添加东西。在第一步,arrayFather.push(arrayChild),也是将arrayFather指向了arrayChild指向的地址A,然后splice是清除arrayChild中的数据,就是将内存中的数据全部清除,所以这时arrayFather = arrayChild = []。这时再往arrayChild中添加新数据,那么arrayFather = arrayChild = [3, 4], 然后arrayFather又push了一次arrayChild,所以最后arrayFather = [[3, 4], [3, 4]]
那想要实现需求怎么办呢?可以用这种方法:
let arrayChild = [];
const arrayFather = [];
arrayChild.push(0, 1);
arrayFather.push(arrayChild);
arrayChild = [];
arrayChild.push(3, 4);
arrayFather.push(arrayChild);
console.log(`arrayFather = ${arrayFather}`);
预想结果是:
arrayFather = [[0, 1], [3, 4]];
实际结果:
arrayFather = [[0, 1], [3, 4]];
这里的arrayChild = []就是在内存中重新开辟一片地址了,所以原来的值还会存在,最终的目的达成。然而,新开辟一片内存意味着资源浪费。具体解决办法明天讲解。
原文:https://www.cnblogs.com/wz71014q/p/9606493.html