浅拷贝
浅拷贝是将原数据中所有的数据复制一份,放到新的变量空间中,两个变量不共享一个内存地址。
- 对象的浅拷贝,Obeject.assign({},新对象)
const obj1={
age:12,
sayhi(){
console.log('hi')
}
}
const obj2=Object.assign({},obj1)
console.log(obj1)
console.log(obj2)
obj1.age = 20;
console.log(obj1);
console.log(obj2);
但是浅拷贝中如果有引用数据类型,在创建新对象的过程中会将,这个引用数据类型的地址也放到新对象中,也就是说没有完全的形成一个新对象,还是跟原对象有些关联。这就是浅拷贝。
2. 数组浅拷贝
let arr1 = [1,2,3]
let arr2 = arr1.concat()/或者slice()
arr1.push(4)
console.log(arr1)
console.log(arr2)
同理,如果数组内有引用数据类型,同样会把地址拷贝过来
所以,所谓的浅拷贝就是说如果数组或对象的值是基本数据类型,那么两个就是完全没有关联,互不影响的两个数据,如果,其中有引用数据类型,那么两个数据中的引用数据类型还是公用一个地址
深拷贝
深拷贝,就是不管原数据中值是什么类型的数据,拷贝后的新数据跟原数据是完全没有关联的。
- 、利用json数据和json字符串之间的转换(对象和数组均可)
var obj = {
name:"张三",
age:12,
wife:{
name:"翠花",
age:20
}
}
var str = JSON.stringify(obj);
var pbj = JSON.parse(str);
obj.wife.gender = '女';
console.log(obj.wife);
console.log(pbj.wife);
但这个方法存在一些问题:
无法序列化函数 忽略symbol和undefined等 无法解决循环引用的对象(即为对象内部的属性互相赋值形成一个循环) 以上问题会导致对象拷贝时出现忽略问题存在的属性
2.递归
function deepClone(obj){
if(typeof obj!=='object'||obj== null){
return
}
let result
if(obj instanceof Array){
result = []
}else {
result = {}
}
for(let key in obj){
//保证key不是原型属性
if(obj.hasOwnProperty(key)){
result[key]=deepClone(obj[key])
}
}
return result
}