查阅资料,看到有关深浅拷贝上面的误区,有人说数组的slice()与concat()方法实现的是深拷贝。对此我做了一些尝试并详细理了一下关于js的深浅拷贝问题。首先我们要知道数据类型的存储方式——
基本类型和引用类型
js中变量分为两类:
基本类型:undefined,null,字符串,数值,布尔
引用类型:统称为object。具体的有Object,Array,Function等
重点是这两种类型的存储方式了:基本类型的数据是存放在栈内存中的,而引用类型的数据是存放在堆内存中的。
基本数据类型,是这个样子的:
引用类型保存在堆中,栈内的是变量的标识符以及对象在堆内存中的存储地址,当需要访问引用类型(如对象,数组等)的值时,首先从栈中获得该对象的地址指针,然后再从对应的堆内存中取得所需的数据。
所以对于这两种类型的赋值是有不同的:
当你在复制基本类型的时候,相当于把值也一并复制给了新的变量。
而在复制引用类型的时候,实际上只是复制了指向堆内存的地址,即原来的变量与复制的新变量指向了同一个东西。