转载声明:文章来源:https://blog.csdn.net/qq_43218707/article/details/107564412
1、js基本数据类型:Number、Boolean、String、null、undefine、Symbol(ES6新增);基本数据类型存放在栈中,它们之间的拷贝均为深拷贝,即两者再无任何关联,如下:
2、js引用数据类型:Object(Array,Date,RegExp,Function);引用数据类型存放在堆中,并在栈中存放一个地址,用于访问堆中的内容。
引用数据类型之间的拷贝要根据拷贝后,两者中其中一者的变化是否会引起另一者的变化来判断,若是两者中其中一方的改变会影响另一方则为浅拷贝,反之为深拷贝。
3、举例浅拷贝
上面的函数中,使用for…in 对数组/对象进行遍历并赋值,此种方法仅能实现浅拷贝。结果如下:
注意:使用for…in赋值后,a中的基本数据类型1,2,3均被拷贝到a_copy中有自己独立的内存,所以a_copy中基本数据类型的变化就不会引起a中的变化,但是引用数据类型的变化会改变a,因为两者都指向一个堆,复制的仅仅是地址。
4、浅拷贝的方法有哪些?
1)for…in,上面例子中已有介绍,这里不再赘述;
2)Object.assign,是ES6的新增方法,可以实现对象之间的合并,第一个参数为目标对象,不同对象直接出现属性名相同时,后面对象的值可以覆盖前面。举例如下:
当参数只有1个时,Object.assign()可以实现对象的浅拷贝,且使用Object.assign()拷贝的对象无论是对于基本数据类型或者引用数据类型,两者任何一方的变化都会引起另一方的变化。如下:
3)直接赋值,举例如下
帖子还没人回复快来抢沙发