个人认为,深拷贝与浅拷贝是针对引用类型提出的,对于基本数据类型不存在,深拷贝与浅拷贝。
任何编程语言的内存分区几乎都是一样的,分为栈区(堆栈),堆区,全局静态区,只读区(常量区和代码区),PHP、js和python是这样。
基本类型和引用类型在内存上存储的区别
var age = 25;
var arr = [1,2,3,4];
var obj = {
attr1:1,
attr2:2,
attr3:3,
attr4:4
}
在上述函数中,age是基本类型,arr和obj是引用类型。age的名称和值都在栈区,arr和obj的名称在栈区,值却在堆区,在栈区只保留了一个堆区的相关地址。
到底什么是基本类型和引用类型
基本类型:就是值类型,即在变量所对应的内存区域存储的是值,如:上面的age变量所对应的内存存储的就是值25。
引用类型:就是地址类型。何为地址:地址就是编号,要地址何用,就是为了容易找到。生活中快递就是通过地址准确送达的。
到底什么是深拷贝和浅拷贝?
浅拷贝就是只拷贝了变量对应的地址,并没有在堆内存中产生新的结果。
var age = 25; var arr = [1,2,3,4]; var obj = { attr1:1, attr2:2, attr3:3, attr4:4 } var copyArr = arr; var copyObj = obj;
上述copyArr和copyObj是拷贝的arr、obj的值,他们对应的地址是一样的。因此他们的值也是一样的,无论是修改copyArr还是arr,输出的结果是一样的。
如何实现深拷贝?
Array.prototype.copyself = function(){ let arr = new Array() ; for(let i in this){ arr[i]= this[i] } return arr; } Object.prototype.copyself = function() { let obj = new Object(); for(let i in this) { obj[i] = this[i] } return obj; } var p = { id: "007", name:"刘德华", readings: new Array("三国演义","红楼梦","水浒传"), other:{ height:\'180cm\', weight:\'80kg\', age:55 } } function copyOjb(obj) { let newObj = {}; for(let i in obj) { if(typeof obj[i]==\'object\') { newObj[i] = obj[i].copyself(); } else { newObj[i] = obj[i]; } } return newObj; } var newP = copyOjb(p); newP.name = \'马德华\'; newP.readings[2] = \'西游记\'; newP.other.weight = \'88kg\' console.log(p); console.log(newP)

还有一种方式:
var p = { id: "007", name:"刘德华", readings: new Array("三国演义","红楼梦","水浒传"), other:{ height:\'180cm\', weight:\'80kg\', age:55 } } let newP = JSON.parse(JSON.stringify(p)); newP.name = \'马德华\'; newP.readings[2] = \'西游记\'; newP.other.weight = \'88kg\' console.log(p); console.log(newP)


