1.变量分为基本数据类型和引用数据类型
基本数据类型:String、Number、Boolean、Underfind、Null、Symbol,存储在内存的栈中
引用数据类型:Object、Array、Function,存储在内存的堆中
2.内存存储图解
a.基本数据类型--名值存储在栈内存中,如let a=1
b.当b=a时,新开了一个内存,所以此时此刻,修改a的值对b的值不影响
引用数据类型--名存在栈内存中,值存在堆内存中,栈内存会提供一个指针指向堆内存的值
当b=a进行拷贝时,其实复制的是a的引用地址,而并非堆里面的值
当修改a[0]='10',b中的值也会改变,此时此刻b对a就是浅拷贝
如果想避免这种问题,就需要给b开辟一个新的内存地址,就是要用到深拷贝
3.实现方式
1.递归函数
function deepClone(obj) {
var cloneInfo = Array.isArray(obj)?[]:{}
for (var k in obj) {
if (obj.hasOwnProperty(k)) {
if (obj[k] && typeof obj[k] == 'object') {
cloneInfo[k] = Array.isArray(obj[k])?[]:{}
cloneInfo[k] = deepClone(obj[k])
} else {
cloneInfo[k] = obj[k]
}
}
}
return cloneInfo;
}
2.序列化和反序列化
var jsonObj = JSON.stringify(obj)
jsonObj = JSON.parse(jsonObj)
3.Object.assign
var assignObj = Object.assign({},obj)
这里有一个提示,如果是对象的一级属性是深拷贝,更改数据后拷贝的数据没有影响,但是二级属性属于浅拷贝,会被影响
4.lodash插件