昨天遇到一个奇怪的问题,代码原意大致如下:
var arr1 = [1,2,3];
var arr2 = arr1;
arr1.push(123);
console.log(arr2);//[1,2,3,123]
一旦两个数组相等,其中一个改变,另一个会跟着改变。
注释:
数组是一种引用数据类型,数组引用变量只是一个引用,数组元素和数组变量在内存里是分开存放的
实际的数组元素被存储在堆(heap)内存中;数组引用变量是一个引用类型的变量,被存储在栈(stack)内存中。数组在内存中的存储示意图如图4.2所示:
参考:http://blog.csdn.net/ysgjiangsu/article/details/50803811
复解:
基本类型:基本的数据类型有:undefined,boolean,number,string,null。 基本类型存放在栈区,访问是按值访问的,就是说你可以操作保存在变量中的实际的值。
引用类型:引用类型指的是对象。可以拥有属性和方法,并且我们可以修改其属性和方法。引用对象存放的方式是:在栈中存放对象变量标示名称和该对象在堆中的存放地址,在堆中存放数据。
对象使用的是引用赋值。当我们把一个对象赋值给一个新的变量时,赋的其实是该对象的在堆中的地址,而不是堆中的数据。也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的。
数组就属于引用类型
参考:https://www.cnblogs.com/telnetzhang/p/5714920.html
如此这般,我要克隆数组咋办?
1. 在ES5中克隆数组
var arr2 = arr1.concat();
2. 在ES6中克隆数组
let [...arr2] = arr1;
注意:以上两种只是浅拷贝,也就是说如果数组里还有对象的话我们就无能为力了
深度拷贝
1.递归遍历
2.JSON.parse(JSON.stringify(arr))