在js中经常会遇到js的深浅拷贝问题,在项目中经常会遇到,所以有必要搞清楚。下面先看一个例子。
通过Object.assign拷贝a,修改a.num的值,b.num 没有改变。修改a.deep.count的值,b.deep.count也改变了,num 和 deep有什么区别吗? num 是基本数据类型,deep是一个对象。js中有五种基本数据类型number,string,boolean,null,undefined,他们的值被以键值对的形式保存在栈中。引用类型包括数组,函数,对象等。
对于基本数据类型栈内存会新开辟一个内存,所以上面a.num 和 b.num是相互独立的,修改不会互相影响。对于引用数据类型,复制的是a的引用地址,而并非堆里面的值,所以上面a.deep.count和b.deep.conut 相互影响。
b中 num 和deep中的值和a中的是相互独立,互不影响。如果把 b.deep 换成 数组 deep:[1, 2, 3],或者换成 function{ console.log(this.num)} ,经过测试也是正常的。