在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,与原对象脱离。
浅拷贝 只拷贝指针,深拷贝就是拷贝他的值,申请一个新的内存,重新生成的对像,与原对象脱离。就像是浅拷贝就是你的影子,深拷贝是你的克隆人,你没了影子也就没了,但是克隆人还活着。
浅拷贝:简单的赋值,指向同一个内存地址。
深拷贝的方法
1.JSON转换
var aa = {
name:'ye',
age:'10'
};
var bb = JSON.stringify(aa)
console.log(bb)
aa.age = 13;
console.log(bb)
{"name":"ye","age":"10"}
{"name":"ye","age":"10"}
缺点:
(1)如果对象里有函数,函数无法被拷贝下来
(2)无法拷贝copyObj对象原型链上的属性和方法
(3)当数据的层次很深,会栈溢出
2.数组对象的cancat()
3.对象数据类型,这个方法需要知道a对象里边都有哪些字段。一个一个的复制,较麻烦。
4.angular的一个方法:angular.copy()
5.普通递归函数
function deepCopy( source ) {
if (!isObject(source)) return source; //如果不是对象的话直接返回
let target = Array.isArray( source ) ? [] : {} //数组兼容
for ( var k in source ) {
if (source.hasOwnProperty(k)) {
if ( typeof source[ k ] === 'object' ) {
target[ k ] = deepCopy( source[ k ] )
} else {
target[ k ] = source[ k ]
}
}
}
return target
}
function isObject(obj) {
return typeof obj === 'object' && obj !== null
}