深拷贝和浅拷贝针对对象和数组
浅拷贝
浅拷贝:将对象和数组复制一份,放到另一个变量中,新变量与原数据不公用一个地址。如果数据中还有引用数据,
浅拷贝后,其中的引用数据会和原数据公用一个地址。
var obj = {
name:'张三',
age:12,
wife:{
name:'如花',
age:11
}
}
var pbj = {}
for(var key in obj){
pbj[key] = obj[key]
}
console.log(pbj)
console.log(obj === pbj) //flase,不公用一个地址
obj.wife.name = '似玉'
console.log(obj)
console.log(pbj) //obj改变了,pbj也改变了,说明数据中还有引用数据wife,
浅拷贝后,其中的引用数据还是会公用一个地址
深拷贝
深拷贝:将数组合对象复制一份,放到另一个变量中,新变量与原数据公用一个地址。如果数据中还有引用数据,
深拷贝后,其中的引用数据不会和原数据公用一个地址
var obj = {
name:'张三',
age:12,
wife:{
name:'如花',
age:11
}
}
function cloneObj(obj) {
if({}.toString.call(obj) === '[object Array]') { //判断obj的类型是否是数组,如果是,
输出空数组s
var s = []
}else if({}.toString.call(obj) === '[object Object]') { //判断obj类型是否是对象,如果是,
输出空对象s
var s = {}
}
for(var key in obj){
if(typeof obj[key] === 'object'){
s[key] = cloneObj(obj[key])
}else {
s[key] = obj[key]
}
}
return s
}
var pbj = cloneObj(obj)
console.log(obj === pbj) //flase
obj.wife.name = '似玉'
console.log(obj)
console.log(pbj) //obj改变了,pbj没有改变,说明如果在数据中还有引用数据,深拷贝后,
其中的引用数据也不会共用一个地址。